PhotoLibrary 访问 .notDetermined,当拒绝时启用

Posted

技术标签:

【中文标题】PhotoLibrary 访问 .notDetermined,当拒绝时启用【英文标题】:PhotoLibrary access .notDetermined, when denying then enabling 【发布时间】:2019-03-28 12:19:00 【问题描述】:

如果我一开始拒绝,然后转到设置并允许设置,在这两种情况下,状态都是未确定,而不是拒绝然后授权。 为什么会这样?

当我单击“不允许”时,它不会保存图像,但状态变为 .notDetermined 而不是 .denied 。 它保存,在我进入设置->照片后,取消选中“从不”并选中“仅添加照片”。但状态保持 .notDetermined,不会变为 .authorized

func save()
        guard let image = imageView.image else return
        UIImageWriteToSavedPhotosAlbum(image, self, nil, nil)

        let status = phphotoLibrary.authorizationStatus()

        switch status 

        case .authorized:
            print("authorized")
            return
        case .notDetermined:  
            print("not determined")
        case .denied, .restricted:
            print("denied or restricted")
            //please go to settings and allow access
            promptToSettings()
        
    

我正在请求将图像保存到照片库的权限。 当用户第一次尝试保存时,系统会询问他:“应用程序想要添加到照片中”“不允许”“好的” 如果用户拒绝然后尝试再次保存,我想检查状态是否为.denied,提示用户转到设置并允许。 但是当用户第一次没有授予访问权限时,代码会转到 .notDetermined 块。即使在用户允许访问的设置中,它仍然保持 .notDetermined。

【问题讨论】:

检查这里 - developer.apple.com/documentation/photokit/… @Anna Oriova,在将权限更改为允许/拒绝后,您是退出并启动应用程序还是从后台启动它以读取授权状态? @Anand 我是双向的。 我测试了上面的代码。每当更改权限时,authorizationStatus 都会为我正确打印。它没有像你提到的那样总是打印“未确定”。我在这里只能想到一种情况。您是否有机会在同一设备上安装了两个具有相同显示名称和不同捆绑 ID 的应用程序? (实际上这是可能的。一个是开发人员签名的,另一个是内部签名的。)如果是这种情况,您有可能更改一个应用程序的权限并在另一个应用程序中查看状态。只是一个想法.. 【参考方案1】:

我下载了您的代码并运行了它。我能够体验到你所说的一切。它总是返回未确定状态。 我进一步对您的代码进行了一些分析。请在下面找到我的观察结果。

    在您当前的代码中,在使用“PHPhotoLibrary.authorizationStatus”方法读取授权状态之前,不会调用“PHPhotoLibrary.requestAuthorization”方法。 虽然 Save 方法中的“UIImageWriteToSavedPhotosAlbum”会触发照片应用权限弹出,但在这里完全没有帮助。 因此,我在 ViewDidLoad 方法中调用了“askForAccessAgain”方法,以便首先使用“PHPhotoLibrary.requestAuthorization”方法获得权限。 之后,每当我使用 Save 方法保存照片时,它都会返回正确的状态,让它成为“授权”或“拒绝”。 如果我选择“从不”和“仅允许照片”,它会返回“拒绝或限制”状态。选择“读写”时,返回“授权”。

所以,看起来,我们需要先调用“PHPhotoLibrary.requestAuthorization”方法来获取权限,而不是依赖其他照片访问方法(如 UIImageWriteToSavedPhotosAlbum)来获取权限。只有这样,“PHPhotoLibrary.authorizationStatus”才会返回正确的状态。

另一个补充信息: 即使在删除应用程序并重新安装后,应用程序权限也会保留。看看这个。它可能会帮助您在将来解决类似的问题。 iPad remembering camera permissions after delete—how to clear?

如果这解决了您的问题,请告诉我。

【讨论】:

谢谢。我将此标记为最佳答案,因为即使经过大量搜索,也没有文章明确表明 UIImageWriteToSavedPhotosAlbum 在这方面不可靠。我阅读了您提供的链接,谢谢。似乎即使不允许这样显示后的“状态”(拒绝),并进入拒绝阻止,它也依赖于设置中的应用程序权限并仍然保存照片。所以依靠这个状态来检查用户是否需要提示是没有运气的。

以上是关于PhotoLibrary 访问 .notDetermined,当拒绝时启用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Photolibrary 将 shouldAutorotate 设置为 false

Swift如何手动设置photoLibrary和相机授权?

为啥 UIImagePickerControllerSourceTypePhotoLibrary 不让用户选择相册?

如何在横向模式下显示 UIImagePickerControllerSourceTypePhotoLibrary

如何显示 Cordova PhotoLibrary 返回的图像?

UIImagePickerControllerSourceTypePhotoLibrary 源类型的 UIImagePickerController 崩溃