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

37
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = true
    self.present(imagePicker, animated: true, completion: { })
}
即使我在设置中将“照片”访问权限设为“从不”,使用上述代码仍然可以显示图片选择器并展示照片。在展示之前,我会检查PHPhotoLibrary.authorizationStatus(),但我想知道这是否是预期行为?

你在 info.plist 文件中添加了哪个键? - Nishant Bhindi
1
我正在设备上进行测试。 - gvuksic
@LeoDabus 谢谢,但问题是如果我的设置说访问照片:“从不”,为什么我仍然可以呈现选择器? - gvuksic
@TofaaniKaanudo no - gvuksic
2
@ gvukcic 我在我的设备上也注意到了这一点。尽管我已将权限设置为“从不”,但仍允许我选择照片。 - badhanganesh
显示剩余6条评论
4个回答

68

好的,你可以从已有的答案和评论中大致了解这个问题,但为了尝试讲述一个更完整的故事...


在iOS 11中,UIImagePickerController作为一个独立的进程运行,不同于你的应用程序。这意味着:
  1. 你的应用程序无法看到用户的整个照片库——它只能读取用户在图像选择器中选择的任何资产的只读访问权限。
  2. 由于(1),你的应用程序不需要标准的隐私授权来访问照片库。用户明确选择了特定的资产(或多个)供你的应用程序使用,这意味着用户授予了你的应用程序读取相关资产的权限。

你可以在WWDC17关于PhotoKit的演讲中了解更多信息。

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


PHPhotoLibrary及其授权状态反映了用户可以从“设置”>“隐私”中控制的全局照片读写权限。(这是您的Info.plist需要NSPhotoLibraryUsageDescription的地方。)无论您的应用程序使用该API仅用于写入或仅用于阅读,都需要此权限。自iOS 8引入PhotoKit以来,这一点就成立了。
如果您没有使用PHPhotoLibraryPHAsset等,则有更窄的权限选项可在iOS 11中使用(而且不是Photos.framework API的一部分):
  • 如上所述,UIImagePickerController不需要全局隐私设置权限,因为每次使用都会授予特定资产的一次性读取访问权限。
  • 如果您只需要将新资产添加到照片库中,请使用UIImageWriteToSavedPhotosAlbumUISaveVideoAtPathToSavedPhotosAlbum。在这些函数中,您可以在Info.plist中放置NSPhotoLibraryAddUsageDescription - 然后系统的隐私设置将向用户明确表示他们不会授予您查看或修改现有资产的权限,只能添加新的资产。

    如果用户授予仅添加权限,则仅适用于这些UIKit函数 - 尝试使用PHPhotoLibrary仍将提示(并需要Info.plist密钥)以获取读/写访问权限。

    请参见WWDC17演讲的此部分以了解更多关于仅添加隐私设置的内容。


3
我正在跟随“开始开发iOS应用程序”教程,使用iOS 11版本,在教程说应该会出现错误时却没有出现错误。这个答案解释了为什么会这样 :D - Alexander Varwijk

6

6
这种(新的)行为对我来说听起来很合理,原因如下。使用UIImagePickerController时,您的应用程序实际上无法访问任何照片。只有当用户选择了某张照片时,您的应用程序才会看到它;如果用户在选取器中点击“取消”,则其中没有任何一张照片可以供应用程序使用。 PHPhotoLibrary是独立框架Photos的一部分,您可以在其中使用用户的照片库并且需要获取用户的许可。
因此,如果您只使用UIImagePickerController,我建议不要混合使用Photos相关的内容。
免责声明:我还没有从Apple公司获得官方声明。这个论坛帖子看起来比较相关,也许我们能在那里获得答复。更新:这里有一个,思路相同。
另外,如果您够狡猾,理论上可以在运行时操纵UIImagePickerController视图层次结构并检查用户在其中看到的内容。但这又是苹果公司需要解决的问题,我们应该友好一些 :-)

3

UIImagePickerController和PHPhotoLibrary负责不同的领域。

您应该检查两者:授权状态和源可用性。

PHAuthorizationStatus

有关您的应用程序访问用户照片库的授权信息

isSourceTypeAvailable

讨论

由于媒体源可能不存在或不可用,因此设备可能不始终支持所有源类型。

例如,如果您尝试从用户的库中选择图像并且库为空,则此方法返回false。 同样,如果相机已在使用中,则此方法也会返回false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接