if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
self.present(imagePicker, animated: true, completion: { })
}
即使我使用上述代码将“设置”中的“照片”访问权限设置为“从不”,我仍然可以显示图像选择器并显示照片。我会在显示之前检查 PHPhotoLibrary.authorizationStatus()
,但我想知道这是预期的行为吗?
最佳答案
好的,您已经可以从答案和评论中拼凑出这些内容,但要尝试讲述一个更完整的故事...
在 iOS 11 中,UIImagePickerController
作为独立于您的应用程序的进程运行。这意味着:
- 您的应用无法查看用户的整个照片库 - 它只会对用户在图像选择器中选择的任何 Assets 进行只读访问。
- 由于 (1),您的应用不需要标准隐私授权即可访问照片库。用户明确选择一个(或多个)特定 Assets 用于您的应用,这意味着用户授予您的应用读取相关 Assets 的权限。
你可以看到更多关于这个in the WWDC17 talk on PhotoKit .
(顺便说一句,这个模型与你在 iOS 9 中看到的 in the Contacts framework 相匹配;如果你显示联系人选择器,你的应用程序只会获得用户选择的联系人的一次性联系信息,而不是对联系人数据库的持续读/写访问,因此联系人选择器不需要特殊的隐私权限。)
PHPhotoLibrary
及其授权状态反射(reflect)了用户可以从“设置”>“隐私”中控制的照片访问的全局读/写权限。 (这是您的 Info.plist 需要 NSPhotoLibraryUsageDescription
的地方。)任何对 PHPhotoLibrary
API 的使用都需要此权限,无论您的应用对该 API 的使用是否仅用于写入或仅供阅读。自 iOS 8 中引入 PhotoKit 以来就是如此。
如果您不使用 PHPhotoLibrary
、PHAsset
等,iOS 11 中新增了更窄的权限选项(不属于 Photos.framework API ):
- 如上所述,
UIImagePickerController
不需要全面的隐私设置权限,因为每次使用都会授予对所选特定 Assets 的一次性读取权限。 如果您只需要将新 Assets 添加到照片库,请使用
UIImageWriteToSavedPhotosAlbum
或UISaveVideoAtPathToSavedPhotosAlbum
.对于这些,您可以将NSPhotoLibraryAddUsageDescription
放入您的 Info.plist - 然后系统的隐私设置将向用户明确表示他们没有授予您查看或修改现有 Assets 的权限,只能添加新 Assets .如果用户授予仅添加权限,则它仅适用于那些 UIKit 函数 — 尝试使用
PHPhotoLibrary
仍将提示(并需要 Info.plist key )读/写访问权限。参见 this part of the WWDC17 talk有关仅添加隐私设置的更多信息。
关于即使设置为 "never",也可以访问 iOS11 照片库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46404628/