我无需请求许可即可访问 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 照片库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS5 中重新请求照片访问权限?

iOS 8 键盘读/写设置,无需请求开放访问

在 iOS 应用中无需征求用户许可即可检索哪些其他信息

如何使用 ALAssetsLibrary 访问照片而不在 iOS5 中请求位置访问?

iOS 14.5将强制App加入请求追踪用户权限!

iOS 14.5将强制App加入请求追踪用户权限!