即使设置被设置为“never”,iOS11照片库访问也是可能的
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { let imagePicker = UIImagePickerController() imagePicker.sourceType = .photoLibrary imagePicker.allowsEditing = true self.present(imagePicker, animated: true, completion: { }) }
即使我使用上面的代码将“设置中的照片”设置为“永不”,我仍然可以呈现图像select器并显示照片。 在显示它之前,我会检查PHPhotoLibrary.authorizationStatus()
,但是我想知道这是否是预期的行为?
好的,你可以从答案和评论中把这件事整理在一起,但是试图讲一个更完整的故事…
在iOS 11中, UIImagePickerController
作为与您的应用程序分开的进程运行。 这意味着:
- 您的应用程序无法看到用户的整个照片库 – 只有用户在图像select器中select的资产才能获得只读访问权限。
- 由于(1),您的应用程序不需要用于照片库访问的标准隐私权限。 用户明确select一个特定的资产(或多个)用于您的应用程序,这意味着用户正在授予您的应用程序读取相关资产的权限。
您可以在WWDC17的PhotoKit上的谈话中看到更多关于此的信息 。
(顺便说一句,这个模型与iOS 9以来在联系人框架中看到的一致 ;如果您显示联系人select器,则您的应用只会获取用户select的联系人的一次性联系信息,而不是正在进行对联系人数据库的读/写访问,因此联系人select器不需要特殊的隐私权限。)
PHPhotoLibrary
及其授权状态反映用户可从“设置”>“隐私”控制的“照片”访问的全局读/写权限。 (这就是你的Info.plist需要NSPhotoLibraryUsageDescription
。)任何使用PHPhotoLibrary
API都需要这个权限,不pipe你的应用程序使用这个API只用于书写还是只用于阅读。 自从iOS 8引入PhotoKit以来,情况一直如此。
如果您不使用PHPhotoLibrary
, PHAsset
等,那么iOS 11中新增的权限范围较窄(而不是Photos.framework API的一部分):
- 如上所述,
UIImagePickerController
不需要全面的“隐私设置”权限,因为每次使用都会授予所选特定资产的一次性读取访问权限。 -
如果只需要将新资源添加到照片库,请使用
UIImageWriteToSavedPhotosAlbum
或UISaveVideoAtPathToSavedPhotosAlbum
。 有了这些,你可以把NSPhotoLibraryAddUsageDescription
放到你的Info.plist中 – 那么系统的隐私设置将会向用户明确表示他们没有权限查看或修改现有资产,只能添加新的资源。如果用户授予只读权限,则仅适用于那些UIKit函数 – 尝试使用
PHPhotoLibrary
仍会提示(并要求Info.plist键)读/写访问权限。有关encryption隐私设置的更多信息,请参阅WWDC17的这部分内容。
这是预期的行为? – 是的。
如果设备支持指定的源types,则为true; 如果指定的源types不可用,则为false。
它会告诉您设备是否支持源types,而不是如果应用程序有权访问它。
正如你已经提到的问题, PHPhotoLibrary.authorizationStatus()
将是正确的方法来检查这一点。
UIImagePickerController和PHPhotoLibrary负责不同的领域。
您应该同时检查:身份validation状态和来源可用性。
PHAuthorizationStatus
有关您的应用授权访问用户的照片库的信息。
isSourceTypeAvailable
讨论
由于媒体源可能不存在或可能不可用 ,因此设备可能并不总是支持所有源types。
例如 ,如果您尝试从用户的库中select一个图像,并且库是空的,则此方法返回false。 同样,如果相机已经在使用中,此方法返回false。
这个(新的)行为对我来说确实合乎逻辑,这就是为什么。 当使用UIImagePickerController
你的应用程序实际上不能访问任何照片。 它只能看到你的用户select的那个,什么时候发生的; 如果用户在选取器中点击“取消”,那么这些应用程序都不可用。
PHPhotoLibrary
是一个单独的框架的一部分, 照片 ,你可以在用户的照片库做很多东西,因此需要权限。
所以,如果你只使用UIImagePickerController
我build议不要混合照片的东西。
免责声明:没有听说过苹果公司的任何官方声明。 这个论坛主题看起来相关,也许我们在那里得到答复。
另外,如果你足够邪恶,理论上可以在运行时UIImagePickerController
视图层次结构,并检查用户在那里看到的任何内容。 但是,这又是苹果处理,我们应该很好:-)