【问题标题】:iOS11 photo library access is possible even if settings are set to "never"即使设置为“从不”也可以访问 iOS11 照片库
【发布时间】:2017-09-25 11:55:18
【问题描述】:
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = true
    self.present(imagePicker, animated: true, completion: { })
}

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

【问题讨论】:

  • 你在 info.plist 中添加了哪个键?
  • 隐私 - 照片库使用说明
  • 你试过模拟器还是设备?
  • 我正在设备上测试
  • @gvuksic 我也注意到了我的设备。即使我将权限设置为从不,它仍然允许我选择照片。

标签: ios swift xcode ios11


【解决方案1】:

好的,您已经可以从答案和 cmets 中拼凑出这个,但要尝试讲述一个更完整的故事...


在 iOS 11 中,UIImagePickerController 作为独立于您的应用的进程运行。这意味着:

  1. 您的应用无法看到用户的整个照片库 - 它仅对用户在图像选择器中选择的任何资产获得只读访问权限。
  2. 由于 (1),您的应用不需要照片库访问的标准隐私授权。用户明确选择在您的应用中使用的特定资产(或多个),这意味着用户正在授予您的应用读取相关资产的权限。

你可以看到更多关于这个in the WWDC17 talk on PhotoKit

(顺便说一下,这个模型与你从 iOS 9 开始看到的 in the Contacts framework 相匹配;如果你显示联系人选择器,你的应用只会一次性获取用户选择的联系人的联系信息,而不是对联系人数据库的持续读/写访问,因此联系人选择器不需要特殊的隐私权限。)


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

如果您不使用PHPhotoLibraryPHAsset 等,iOS 11 中新增了更窄的权限选项(不是 Photos.framework API 的一部分):

  • 如上所述,UIImagePickerController 不需要一揽子隐私设置权限,因为每次使用都会授予对所选特定资产的一次性读取权限。
  • 如果您只需要向照片库添加新资源,请使用UIImageWriteToSavedPhotosAlbumUISaveVideoAtPathToSavedPhotosAlbum。有了这些,您可以将 NSPhotoLibraryAddUsageDescription 放入您的 Info.plist 中——然后系统的隐私设置将向用户明确表明他们不允许您查看或修改现有资产,而只是添加新资产。

    如果用户授予 add-only 权限,它仅适用于那些 UIKit 函数 - 尝试使用 PHPhotoLibrary 仍会提示(并需要 Info.plist 键)读/写访问权限。

    请参阅this part of the WWDC17 talk,了解有关仅添加隐私设置的更多信息。

【讨论】:

  • 我正在使用 iOS 11 遵循“开始开发 iOS 应用程序”教程,当教程说我应该得到一个时没有收到错误。这个答案解释了为什么会这样:D
【解决方案2】:

这是预期的行为吗? - 是的。

来自文档 - https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable

如果设备支持指定的源类型,则为真;如果指定的源类型不可用,则返回 false。

它告诉你设备是否支持源类型,而不是应用程序是否有权访问它。

正如您在问题中已经提到的,PHPhotoLibrary.authorizationStatus() 将是检查此问题的正确方法。

【讨论】:

    【解决方案3】:

    这个(新的)行为确实对我来说听起来合乎逻辑,这就是原因。使用UIImagePickerController 时,您的应用实际上无法访问任何 照片。当发生这种情况时,它只会看到您的用户选择的那个;如果用户在选择器中点击“取消”,应用程序将无法使用这些选项。

    PHPhotoLibrary 是独立框架Photos 的一部分,您可以在其中使用用户的照片库做很多事情,因此需要权限。

    因此,如果您只使用 UIImagePickerController,我建议不要将照片内容混入其中。

    免责声明:没有听说过苹果人的任何官方声明。 This forum thread 看起来很相关,也许我们会在那里得到回复。 UPD: there it is,同样的想法。

    另外,如果你足够邪恶,理论上你可以在运行时摆弄UIImagePickerController 视图层次结构并检查用户在那里看到的任何内容。但这又是苹果要处理的问题,我们应该很好:-)

    【讨论】:

      【解决方案4】:

      UIImagePickerController 和 PHPhotoLibrary 负责不同的区域。

      您应该同时检查:身份验证状态和源可用性。

      PHAuthorizationStatus

      有关您的应用的访问权限用户照片的信息 图书馆。

      isSourceTypeAvailable

      讨论

      因为媒体源可能不存在或可能不可用, 设备可能并不总是支持所有源类型。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        相关资源
        最近更新 更多