我无需请求许可即可访问 iOS 照片库
Posted
技术标签:
【中文标题】我无需请求许可即可访问 iOS 照片库【英文标题】:I can access iOS Photo Library without requesting permission 【发布时间】:2019-01-31 04:54:25 【问题描述】:我正在尝试访问我正在编写的新应用的照片库。我有一个 actionSheet,允许用户在他们的相机和他们的照片库之间进行选择。打开相机时,它会请求用户许可,但在打开照片库时却没有。尽管如此,它仍然将用户带到他们的照片库。我在 info.plist 中专门引用了它,但仍然没有区别。有什么帮助吗?我的代码:
@IBAction func allowAccessToPhotos(_ sender: Any)
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
let actionSheet = UIAlertController(title: "Photo Source", message: "Choose a Source", preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: (action:UIAlertAction) in imagePickerController.sourceType = .photoLibrary
self.present(imagePickerController, animated: true, completion: nil)
))
actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: (action:UIAlertAction) in imagePickerController.sourceType = .camera
self.present(imagePickerController, animated: true, completion: nil)
))
actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
self.present(actionSheet, animated: true, completion: nil)
【问题讨论】:
你在 Info.plist 中添加了什么? @MayurKarmur 我添加了“隐私 - 相机使用说明”和“隐私 - 照片库使用说明” 这是右键,但不请求许可,很奇怪。 @BobSamuels 您之前是否安装过您的应用并授予了权限,如果您希望在应用设置中检查权限 @BobSamuels 发生的事情是 ios 正在保存授予您的应用程序的权限,如果应用程序被删除,则映射到捆绑 ID,此数据会保留 24 小时,这样可以避免在用户重新安装时重新提示用户应用程序(可能是在错误地删除应用程序之后)。推送通知提示也会发生这种情况。 【参考方案1】:根据UIImagePickerController
的行为,它永远不会向用户提供Photos
访问权限的对话。 UIImagePickerController
只请求Camera
权限。
您必须手动向用户询问Photos
permission
。通过使用以下代码,您可以向用户请求Photos
权限。
import Photos
@IBAction func allowAccessToPhotos(_ sender: Any)
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
let actionSheet = UIAlertController(title: "Photo Source", message: "Choose a Source", preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: (action:UIAlertAction) in imagePickerController.sourceType = .photoLibrary
let photoAuthorizationStatus = phphotoLibrary.authorizationStatus()
switch photoAuthorizationStatus
case .authorized:
self.present(imagePickerController, animated: true, completion: nil)
case .notDetermined:
PHPhotoLibrary.requestAuthorization(
(newStatus) in
DispatchQueue.main.async
if newStatus == PHAuthorizationStatus.authorized
self.present(imagePickerController, animated: true, completion: nil)
else
print("User denied")
)
break
case .restricted:
print("restricted")
break
case .denied:
print("denied")
break
))
actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: (action:UIAlertAction) in imagePickerController.sourceType = .camera
self.present(imagePickerController, animated: true, completion: nil)
))
请参考reference.
重要提示:
如果您没有向用户请求
Photos
权限,那么它将导致苹果团队拒绝。这取决于你的运气,有时苹果团队会忽略它,有时会拒绝我们的应用。
【讨论】:
您需要在 requestAuthorization 处理程序中将 ui-code 包装到 DispatchQueue.main.asynch 因为 Photos 框架可以在任意队列上调用它 developer.apple.com/documentation/photokit/phphotolibrary/…【参考方案2】:从 iOS 11 开始,UIImagePickerController
在单独的进程上远程运行。
因此,您的应用不需要照片库访问的标准隐私授权,它仅对用户在 imagePicker 中选择的任何资产获得只读访问权限。
要将新资产添加到照片库中,您需要在 Info.plist 中添加 NSPhotoLibraryAddUsageDescription
- forum thread
【讨论】:
以上是关于我无需请求许可即可访问 iOS 照片库的主要内容,如果未能解决你的问题,请参考以下文章