好的,你可以从答案和评论中把它拼凑起来,但是试着讲一个更完整的故事......
在iOS 11中,UIImagePickerController
作为与您的应用程序分开的进程运行.这意味着:
您的应用无法看到用户的整个照片库 - 它只能为用户在图像选择器中选择的任何资产获得只读访问权限.
由于(1),您的应用不需要照片库访问的标准隐私权授权.用户明确选择要在您的应用中使用的特定资产(或多个),这意味着用户授予您的应用程序读取相关资产的权限.
您可以在关于PhotoKit的WWDC17演讲中看到更多相关信息.
(顺便说一句,这个模型与iOS 9中你在Contacts框架中看到的相匹配;如果你显示联系人选择器,你的应用只能获得用户选择的联系人的一次性联系信息,而不是对联系人数据库的持续读/写访问权限,因此联系人选择器不需要特殊的隐私权限.)
PHPhotoLibrary
其授权状态反映了用户可以通过"设置">"隐私"控制的"照片"访问权限的全局读/写权限.(这是您的Info.plist需要的那个NSPhotoLibraryUsageDescription
.)任何PHPhotoLibrary
API的使用都需要此权限,无论您的应用程序使用该API仅用于写入还是仅用于阅读.自从PhotoKit在iOS 8中引入以来,情况就是如此.
如果你没有使用PHPhotoLibrary
,PHAsset
等等,那么iOS 11中新增的权限选项较窄(而不是Photos.framework API的一部分):
如上所述,UIImagePickerController
不需要全面的"隐私设置"权限,因为每次使用都会为所选的特定资产授予一次性读取权限.
如果只需要将新资源添加到照片库,请使用UIImageWriteToSavedPhotosAlbum
或UISaveVideoAtPathToSavedPhotosAlbum
.使用您可以放入NSPhotoLibraryAddUsageDescription
Info.plist中的那些- 然后系统的隐私设置将向用户明确表示他们未授予您查看或修改现有资产的权限,只能添加新资产.
如果用户授予仅添加权限,则它仅适用于那些UIKit函数 - 尝试使用PHPhotoLibrary
仍将提示(并需要Info.plist键)读/写访问权限.
有关仅添加隐私设置的更多信息,请参阅WWDC17演讲的这一部分.
Tarun Tyagi..
6
这是预期的行为吗? - 是的
来自文档 - https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable
如果设备支持指定的源类型,则为true; 如果指定的源类型不可用,则返回false.
它会告诉您设备是否支持源类型,而不是应用程序是否具有访问它的权限.
正如您在问题中已经提到的PHPhotoLibrary.authorizationStatus()
那样,检查这个是正确的方法.
1> rickster..:
好的,你可以从答案和评论中把它拼凑起来,但是试着讲一个更完整的故事......
在iOS 11中,UIImagePickerController
作为与您的应用程序分开的进程运行.这意味着:
您的应用无法看到用户的整个照片库 - 它只能为用户在图像选择器中选择的任何资产获得只读访问权限.
由于(1),您的应用不需要照片库访问的标准隐私权授权.用户明确选择要在您的应用中使用的特定资产(或多个),这意味着用户授予您的应用程序读取相关资产的权限.
您可以在关于PhotoKit的WWDC17演讲中看到更多相关信息.
(顺便说一句,这个模型与iOS 9中你在Contacts框架中看到的相匹配;如果你显示联系人选择器,你的应用只能获得用户选择的联系人的一次性联系信息,而不是对联系人数据库的持续读/写访问权限,因此联系人选择器不需要特殊的隐私权限.)
PHPhotoLibrary
其授权状态反映了用户可以通过"设置">"隐私"控制的"照片"访问权限的全局读/写权限.(这是您的Info.plist需要的那个NSPhotoLibraryUsageDescription
.)任何PHPhotoLibrary
API的使用都需要此权限,无论您的应用程序使用该API仅用于写入还是仅用于阅读.自从PhotoKit在iOS 8中引入以来,情况就是如此.
如果你没有使用PHPhotoLibrary
,PHAsset
等等,那么iOS 11中新增的权限选项较窄(而不是Photos.framework API的一部分):
如上所述,UIImagePickerController
不需要全面的"隐私设置"权限,因为每次使用都会为所选的特定资产授予一次性读取权限.
如果只需要将新资源添加到照片库,请使用UIImageWriteToSavedPhotosAlbum
或UISaveVideoAtPathToSavedPhotosAlbum
.使用您可以放入NSPhotoLibraryAddUsageDescription
Info.plist中的那些- 然后系统的隐私设置将向用户明确表示他们未授予您查看或修改现有资产的权限,只能添加新资产.
如果用户授予仅添加权限,则它仅适用于那些UIKit函数 - 尝试使用PHPhotoLibrary
仍将提示(并需要Info.plist键)读/写访问权限.
有关仅添加隐私设置的更多信息,请参阅WWDC17演讲的这一部分.
我正在使用iOS 11跟随"开始开发iOS应用程序"教程,并且在教程说我应该得到一个时没有出现错误.这个答案解释了为什么会这样:D
2> Tarun Tyagi..:
这是预期的行为吗? - 是的
来自文档 - https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable
如果设备支持指定的源类型,则为true; 如果指定的源类型不可用,则返回false.
它会告诉您设备是否支持源类型,而不是应用程序是否具有访问它的权限.
正如您在问题中已经提到的PHPhotoLibrary.authorizationStatus()
那样,检查这个是正确的方法.
3> Gleb A...:
这种(新的)行为对我来说确实合乎逻辑,这就是原因。使用UIImagePickerController
您的应用时,实际上并没有访问任何照片的权限。发生这种情况时,它只会看到您的用户选择的一个。并且如果用户在选择器中点击“取消”,则这些都不对应用程序可用。
PHPhotoLibrary
是单独的框架Photos的一部分,在这里您可以使用用户的照片库做很多事情,因此需要获得许可。
因此,如果您仅在使用,UIImagePickerController
我建议不要混入“照片”内容。
免责声明:尚未听到苹果公司的任何正式声明。这个论坛主题看起来很相关,也许我们在那里得到答复。UPD: 是的,同样的想法。
另外,如果您足够邪恶,则理论上可以UIImagePickerController
在运行时摆弄视图层次结构,然后检查用户在那里看到的内容。但这又是苹果要处理的,我们应该很好:-)