一尘不染

即使将设置设置为“从不”,也可以访问iOS11照片库

swift

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

即使使用上述代码将“设置”中的“照片”访问权限设置为“从不”,我仍然可以显示图像选择器并显示照片。我会PHPhotoLibrary.authorizationStatus()在显示之前进行检查,但我想知道这是预期的行为吗?


阅读 212

收藏
2020-07-07

共1个答案

一尘不染

好的,您可以将答案和评论中的一部分拼凑起来,但要尝试讲出更完整的故事…


在iOS 11中,UIImagePickerController与应用程序分开运行。这意味着:

  1. 您的应用看不到用户的整个照片库-它仅对用户在图像选择器中选择的任何资产都具有只读访问权限。
  2. 由于(1),您的应用不需要标准的隐私授权即可访问照片库。用户明确选择了一个(或多个)特定资产供您的应用程序使用,这意味着该用户已授予您的应用程序权限以读取相关资产。

您可以在PhotoKit的WWDC17演讲中看到有关此内容的更多信息。

(顺便说一下,此模型与您自iOS
9以来在Contacts框架中看到的模型匹配;如果显示联系人选择器,则您的应用只会获得用户选择的联系人的一次性联系信息,而不会对联系人数据库的持续读写访问权限,因此联系人选择器不需要特殊的隐私权限。)


PHPhotoLibrary其授权状态反映了用户可以从“设置”>“隐私”中控制的“照片”访问权限的全局读/写权限。(这就是您的Info.plist所需要的NSPhotoLibraryUsageDescription。)对该PHPhotoLibraryAPI的任何使用都需要此权限,无论您的应用对该API的使用是仅用于写入还是仅用于读取。自从iOS
8中引入PhotoKit以来,这就是事实。

如果您未使用PHPhotoLibraryPHAsset等,则iOS 11中新增了一些较窄的权限选项(并且不属于Photos.framework
API):

  • 如上所述,UIImagePickerController不需要全面的“隐私设置”权限,因为每次使用都会授予对所选特定资产的一次性读取访问权限。
  • 如果您只需要向照片库添加新资产,请使用UIImageWriteToSavedPhotosAlbumUISaveVideoAtPathToSavedPhotosAlbum。使用这些内容,您可以将它们放入NSPhotoLibraryAddUsageDescriptionInfo.plist中-然后,系统的“隐私设置”将向用户表明,他们不授予您查看或修改现有资产的权限,而只是添加新资产。

如果用户授予仅添加权限,则该权限仅适用于那些UIKit函数-
尝试使用PHPhotoLibrary仍将提示(并要求使用Info.plist键)读/写访问权限。

有关仅添加隐私设置的更多信息,请参见WWDC17讨论的这一部分

2020-07-07