_if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
self.present(imagePicker, animated: true, completion: { })
}
_
上記のコードで[設定]の[写真]へのアクセスを[なし]に設定しても、画像ピッカーを表示して写真を表示できます。表示する前にPHPhotoLibrary.authorizationStatus()
を確認しますが、これは予期される動作ですか?
さて、あなたはすでに答えとコメントからこれを並べ替えることができますが、より完全な話をしようとしています...
IOS 11では、UIImagePickerController
はアプリとは別のプロセスとして実行されます。つまり:
これについて詳しく見ることができます PhotoKitのWWDC17トークで .
(ちなみに、このモデルはあなたが見たものと一致します 連絡先フレームワーク内 iOS 9以降;連絡先ピッカーを表示すると、アプリは連絡先の連絡先情報を一度だけ取得します( s)連絡先データベースへの継続的な読み取り/書き込みアクセスではなく、ユーザーが選択したため、連絡先ピッカーは特別なプライバシー許可を必要としません。
PHPhotoLibrary
とその承認ステータスは、ユーザーが[設定]> [プライバシー]から制御できる写真アクセスのグローバルな読み取り/書き込み権限を反映しています。 (これは、Info.plistがNSPhotoLibraryUsageDescription
を必要とするものです。)PHPhotoLibrary
APIを使用するには、アプリでのAPIの使用が書き込み専用か読み取り専用かに関係なく、この権限が必要です。 。 PhotoKitがiOS 8で導入されて以来、これは事実です。
PHPhotoLibrary
、PHAsset
などを使用していない場合、iOS 11で新しく追加されたより狭い許可オプションがあります(Photos.framework APIの一部ではありません)。
UIImagePickerController
には、選択した特定のアセットに対する1回限りの読み取りアクセスが許可されるため、ブランケットプライバシー設定権限は不要です。写真ライブラリに新しいアセットを追加するだけの場合、 UIImageWriteToSavedPhotosAlbum
または UISaveVideoAtPathToSavedPhotosAlbum
を使用します。 Info.plistにNSPhotoLibraryAddUsageDescription
を含めることができます—システムのプライバシー設定は、既存のアセットを表示または変更する許可を与えていないことをユーザーに明らかにし、新しいアセットを追加するだけです。
ユーザーが追加のみのアクセス許可を付与する場合、UIKit関数にのみ適用されます。PHPhotoLibrary
を使用しようとすると、読み取り/書き込みアクセスが要求されます(そしてInfo.plistキーが必要です)。
追加のみのプライバシー設定の詳細については、 WWDC17トークのこの部分 を参照してください。
この(新しい)動作doesは論理的に聞こえますが、これが理由です。 UIImagePickerController
を使用する場合、アプリは実際にはany写真にアクセスできません。それが発生した場合、ユーザーが選択したもののみが表示されます。また、ユーザーがピッカーで[キャンセル]をタップすると、アプリでそれらのいずれも使用できなくなります。
PHPhotoLibrary
は別のフレームワーク Photos の一部であり、ユーザーの写真ライブラリで多くのことを行うことができるため、許可が必要です。
したがって、UIImagePickerController
のみを使用している場合は、not写真のものを混ぜることをお勧めします。
免責事項:Apple人々。 このフォーラムスレッド は関連性があるようです。おそらくそこに返信があります。UPD:ある 、同じ考え。
また、もしあなたが十分に邪悪なら、実行時にUIImagePickerController
ビュー階層を理論的にいじって、そこにユーザーが見ているものすべてを調べることができます。しかし、これはAppleに対処するためのものです、私たちはただニースにならなければなりません:-)
これは予想される動作ですか?-はい。
デバイスが指定されたソースタイプをサポートする場合はtrue。指定されたソースタイプが利用できない場合はfalse。
デバイスがソースタイプをサポートしているかどうかを通知し、アプリにアクセスする権限があるかどうかは通知しません。
質問ですでに述べたように、PHPhotoLibrary.authorizationStatus()
はこれをチェックする正しい方法です。
UIImagePickerControllerとPHPhotoLibraryは異なる領域を担当します。
認証ステータスとソースの可用性の両方を確認する必要があります。
PHAuthorizationStatus
アプリの情報アクセスの許可ユーザーの写真ライブラリ。
isSourceTypeAvailable
ディスカッション
メディアソースが存在しないか、またはnavailableである可能性があるため、デバイスは常にすべてのソースタイプをサポートするとは限りません。
たとえば、ユーザーのライブラリから画像を選択しようとしてライブラリが空の場合、このメソッドはfalseを返します。同様に、カメラがすでに使用されている場合、このメソッドはfalseを返します。