if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { let imagePicker = UIImagePickerController() imagePicker.sourceType = .photoLibrary imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: { }) }
即使使用上述代码将“设置”中的“照片”访问权限设置为“从不”,我仍然可以显示图像选择器并显示照片。我会PHPhotoLibrary.authorizationStatus()在显示之前进行检查,但我想知道这是预期的行为吗?
PHPhotoLibrary.authorizationStatus()
好的,您可以将答案和评论中的一部分拼凑起来,但要尝试讲出更完整的故事…
在iOS 11中,UIImagePickerController与应用程序分开运行。这意味着:
UIImagePickerController
您可以在PhotoKit的WWDC17演讲中看到有关此内容的更多信息。
(顺便说一下,此模型与您自iOS 9以来在Contacts框架中看到的模型匹配;如果显示联系人选择器,则您的应用只会获得用户选择的联系人的一次性联系信息,而不会对联系人数据库的持续读写访问权限,因此联系人选择器不需要特殊的隐私权限。)
PHPhotoLibrary其授权状态反映了用户可以从“设置”>“隐私”中控制的“照片”访问权限的全局读/写权限。(这就是您的Info.plist所需要的NSPhotoLibraryUsageDescription。)对该PHPhotoLibraryAPI的任何使用都需要此权限,无论您的应用对该API的使用是仅用于写入还是仅用于读取。自从iOS 8中引入PhotoKit以来,这就是事实。
PHPhotoLibrary
NSPhotoLibraryUsageDescription
如果您未使用PHPhotoLibrary,PHAsset等,则iOS 11中新增了一些较窄的权限选项(并且不属于Photos.framework API):
PHAsset
UIImageWriteToSavedPhotosAlbum
UISaveVideoAtPathToSavedPhotosAlbum
NSPhotoLibraryAddUsageDescription
如果用户授予仅添加权限,则该权限仅适用于那些UIKit函数- 尝试使用PHPhotoLibrary仍将提示(并要求使用Info.plist键)读/写访问权限。
有关仅添加隐私设置的更多信息,请参见WWDC17讨论的这一部分。