web-dev-qa-db-ja.com

設定が「なし」に設定されている場合でも、iOS11の写真ライブラリにアクセスできます

_if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = true
    self.present(imagePicker, animated: true, completion: { })
}
_

上記のコードで[設定]の[写真]へのアクセスを[なし]に設定しても、画像ピッカーを表示して写真を表示できます。表示する前にPHPhotoLibrary.authorizationStatus()を確認しますが、これは予期される動作ですか?

31
gvuksic

さて、あなたはすでに答えとコメントからこれを並べ替えることができますが、より完全な話をしようとしています...


IOS 11では、UIImagePickerControllerはアプリとは別のプロセスとして実行されます。つまり:

  1. アプリはユーザーの写真ライブラリ全体を見ることができません。画像ピッカーでユーザーが選択したアセットに対してのみ読み取り専用アクセスを取得します。
  2. (1)のため、アプリはフォトライブラリへのアクセスに標準のプライバシー認証を必要としません。ユーザーは、アプリで使用する特定のアセット(または複数)を明示的に選択します。これは、ユーザーが問題のアセットを読み取る許可をアプリに付与していることを意味します。

これについて詳しく見ることができます PhotoKitのWWDC17トークで .

(ちなみに、このモデルはあなたが見たものと一致します 連絡先フレームワーク内 iOS 9以降;連絡先ピッカーを表示すると、アプリは連絡先の連絡先情報を一度だけ取得します( s)連絡先データベースへの継続的な読み取り/書き込みアクセスではなく、ユーザーが選択したため、連絡先ピッカーは特別なプライバシー許可を必要としません。


PHPhotoLibraryとその承認ステータスは、ユーザーが[設定]> [プライバシー]から制御できる写真アクセスのグローバルな読み取り/書き込み権限を反映しています。 (これは、Info.plistがNSPhotoLibraryUsageDescriptionを必要とするものです。)PHPhotoLibrary AP​​Iを使用するには、アプリでのAPIの使用が書き込み専用か読み取り専用かに関係なく、この権限が必要です。 。 PhotoKitがiOS 8で導入されて以来、これは事実です。

PHPhotoLibraryPHAssetなどを使用していない場合、iOS 11で新しく追加されたより狭い許可オプションがあります(Photos.framework APIの一部ではありません)。

  • 上記のように、UIImagePickerControllerには、選択した特定のアセットに対する1回限りの読み取りアクセスが許可されるため、ブランケットプライバシー設定権限は不要です。
  • 写真ライブラリに新しいアセットを追加するだけの場合、 UIImageWriteToSavedPhotosAlbum または UISaveVideoAtPathToSavedPhotosAlbum を使用します。 Info.plistにNSPhotoLibraryAddUsageDescriptionを含めることができます—システムのプライバシー設定は、既存のアセットを表示または変更する許可を与えていないことをユーザーに明らかにし、新しいアセットを追加するだけです。

    ユーザーが追加のみのアクセス許可を付与する場合、UIKit関数にのみ適用されます。PHPhotoLibraryを使用しようとすると、読み取り/書き込みアクセスが要求されます(そしてInfo.plistキーが必要です)。

    追加のみのプライバシー設定の詳細については、 WWDC17トークのこの部分 を参照してください。

57
rickster

この(新しい)動作doesは論理的に聞こえますが、これが理由です。 UIImagePickerControllerを使用する場合、アプリは実際にはany写真にアクセスできません。それが発生した場合、ユーザーが選択したもののみが表示されます。また、ユーザーがピッカーで[キャンセル]をタップすると、アプリでそれらのいずれも使用できなくなります。

PHPhotoLibraryは別のフレームワーク Photos の一部であり、ユーザーの写真ライブラリで多くのことを行うことができるため、許可が必要です。

したがって、UIImagePickerControllerのみを使用している場合は、not写真のものを混ぜることをお勧めします。

免責事項:Apple人々。 このフォーラムスレッド は関連性があるようです。おそらくそこに返信があります。UPD:ある 、同じ考え。

また、もしあなたが十分に邪悪なら、実行時にUIImagePickerControllerビュー階層を理論的にいじって、そこにユーザーが見ているものすべてを調べることができます。しかし、これはAppleに対処するためのものです、私たちはただニースにならなければなりません:-)

6
Gleb A.

これは予想される動作ですか?-はい。

ドキュメントから- https://developer.Apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable

デバイスが指定されたソースタイプをサポートする場合はtrue。指定されたソースタイプが利用できない場合はfalse。

デバイスがソースタイプをサポートしているかどうかを通知し、アプリにアクセスする権限があるかどうかは通知しません。

質問ですでに述べたように、PHPhotoLibrary.authorizationStatus()はこれをチェックする正しい方法です。

5
Tarun Tyagi

UIImagePickerControllerとPHPhotoLibraryは異なる領域を担当します。

認証ステータスとソースの可用性の両方を確認する必要があります。

PHAuthorizationStatus

アプリの情報アクセスの許可ユーザーの写真ライブラリ。

isSourceTypeAvailable

ディスカッション

メディアソースが存在しないか、またはnavailableである可能性があるため、デバイスは常にすべてのソースタイプをサポートするとは限りません。

たとえば、ユーザーのライブラリから画像を選択しようとしてライブラリが空の場合、このメソッドはfalseを返します。同様に、カメラがすでに使用されている場合、このメソッドはfalseを返します。

3
LLIAJLbHOu