if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
self.present(imagePicker, animated: true, completion: { })
}
即使我使用上述代码将设置中的照片设置为“从不”,我仍然可以显示图像选择器并显示照片。在显示之前我会检查PHPhotoLibrary.authorizationStatus()
,但我想知道这是预期的行为吗?
答案 0 :(得分:53)
好的,你已经可以从答案和评论中把它拼凑起来了,但是试着讲一个更完整的故事......
在iOS 11中,PHPhotoLibrary
作为与您的应用分开的进程运行。这意味着:
您可以详细了解此in the WWDC17 talk on PhotoKit。
(顺便说一句,此模型与iOS 9中的in the Contacts framework匹配;如果您显示联系人选择器,您的应用只会获得联系人的一次性联系信息。用户选择,而不是对联系人数据库的持续读/写访问权限,因此联系人选择器不需要特殊的隐私权限。)
NSPhotoLibraryUsageDescription
及其授权状态反映了用户可以通过设置>控制的照片访问权限的全局读/写权限。隐私。 (这是您的Info.plist需要PHPhotoLibrary
的那个。)。PHPhotoLibrary
API的任何使用都需要此权限,无论您的应用程序使用该API仅用于写入还是仅用于阅读。自从PhotoKit在iOS 8中引入以来,情况就是如此。
如果您没有使用PHAsset
,UIImagePickerController
等,那么iOS 11中新增的权限选项较窄(而不是Photos.framework API的一部分):
NSPhotoLibraryAddUsageDescription
不需要全面的隐私权设置权限,因为每次使用都会为所选的特定资产授予一次性读取权限。如果您只需要向照片库添加新资源,请使用UIImageWriteToSavedPhotosAlbum
或UISaveVideoAtPathToSavedPhotosAlbum
。您可以将PHPhotoLibrary
放入Info.plist中 - 然后系统的隐私设置会向用户表明他们未授予您查看或修改现有资产的权限,只能添加新资产。
如果用户授予add-only权限,它仅适用于那些UIKit函数 - 尝试使用var namesOfIntegers = [Int: String]()
仍会提示(并需要Info.plist键)读/写访问权限。
有关仅限添加的隐私设置的详情,请参阅this part of the WWDC17 talk。
答案 1 :(得分:6)
这种(新的)行为确实听起来合情合理,这就是原因。使用UIImagePickerController
时,您的应用实际上无法访问任何照片。它只会看到你的用户选择的那个,当发生这种情况时;如果用户点击选择器中的取消,那么这些应用程序都无法使用。
PHPhotoLibrary
是单独框架Photos的一部分,您可以在其中使用用户的照片库执行大量操作,因此需要获得许可。
因此,如果您只使用UIImagePickerController
我建议不混合照片内容。
免责声明:没有人听说过苹果公司的官方声明。 This forum thread看起来很相关,也许我们会在那里得到答复。 UPD: there it is,同样的想法。
另外,如果你足够邪恶,理论上你可以在运行时摆弄UIImagePickerController
视图层次结构并检查用户在那里看到的内容。但是,对于苹果公司来说,我们应该做得很好,我们应该做得很好: - )
答案 2 :(得分:5)
这是预期的行为吗? - 是。
如果设备支持指定的源类型,则为true;如果指定的源类型不可用,则返回false。
它告诉您设备是否支持源类型,而不是应用程序是否具有访问它的权限。
正如您在问题中已经提到的那样,PHPhotoLibrary.authorizationStatus()
将是检查此问题的正确方法。
答案 3 :(得分:3)
UIImagePickerController和PHPhotoLibrary负责不同的领域。
您应该同时检查:身份验证状态和源可用性。
<强> PHAuthorizationStatus 强>
有关您应用的访问权限用户照片的信息 库。
<强> isSourceTypeAvailable 强>
<强>讨论强>
由于媒体来源可能不存在或可能不可用, 设备可能并不总是支持所有源类型。
例如,如果你 尝试从用户的库中选择一个图像,该库是 为空,此方法返回false。同样,如果相机已经存在 在使用中,此方法返回false。