首页 > 解决方案 > iOS 14 相机和照片权限流程

问题描述

嘿伙计们,我很难理解在 iOS 14 中处理相机和照片权限的正确方法以及适当的流程是什么。感觉就像我忽略了一些简单的事情,但不确定到底是什么。

对于上下文,在用户第一次点击相应按钮之前,不会提示用户请求相机或照片权限。该应用程序包含一个自定义照片选择器,它根据之前的照片关联显示可供选择的照片(即,一张照片一次只能属于一个产品,并且不会在自定义选择器中显示为“可用”,除非它没有关联与产品)。

如果用户点击相机按钮,接受许可请求,拍照并点击“使用照片”,则该按钮UIImagePickerController被关闭,并显示一个提示,要求用户使用Select Photos...、或。如果用户选择允许访问所有照片没有问题,则使用 PhotoKit API 保存照片,并更新 UI 以显示刚刚拍摄的照片的缩略图。一切都按预期工作。Allow AccessAll PhotosDon't Allow

如果用户选择选择某些照片,PHPickerViewController则显示 a 并且不包括刚用相机拍摄的照片,因为它尚未保存。这是有道理的,尽管让我想知道如何保存图像并允许选择有限照片访问权限的用户选择新拍摄的照片?也许这是不可能的。

我在流程中看到了额外的小问题,如果用户PHPickerViewController在选择受限访问权限后点击“完成”关闭而不做任何选择,则应用程序能够使用 PhotoKit API 保存从相机拍摄的图像,并且UI 更新以显示缩略图(这似乎不正确,尽管我可能误解了一些简单的东西)。

在应用程序的同一运行中,如果用户点击照片按钮,则会向他们显示自定义选择器,并且日志记录显示用户可用的照片的获取计数为 0。这是有道理的,因为没有做出任何选择。但是,在下一次运行应用程序时,如果用户点击照片按钮,则会向他们显示Select More Photos...或的警报Keep Current Selection。如果他们选择添加到照片选择中,他们会看到一个PHPickerViewController显示先前使用相机拍摄的照片作为用户选择的照片,并且可用照片的获取计数为 1。此外,在受限访问模式下,尝试生成缩略图会在 Xcode 控制台中产生错误,指示不允许操作或解码资产失败。我在控制台中看到了以下内容:[Thumbnails] Could not open PLPositionalImageTable...

感觉在 iOS 14 拍摄、保存和使用照片(甚至是有限的选择)的过程中,我缺少一些基本的东西。有没有人有这方面的经验,或者除了最近的 WWDC 视频之外的资源,可能会阐明我错过了什么?提前感谢帮助。

同样,我很想依赖PHPickerViewController而不是自定义选择器,但是除非我遗漏了什么,PHPickerViewController否则不允许我们提供要显示的照片子集,并且即使该子集受到用户选择的限制,也只能显示该子集。访问模式。如果我被误导了,我也会很感激那里的方向。谢谢大家!

标签: iosswiftphotokit

解决方案


该问题尚不清楚您如何使用自定义图像选择器。以及如何捕捉图像。如果您使用本机图像选择器捕获图像,就像它看起来一样。选择器代表将提供图像而不保存照片。但看起来您正在尝试首先将图像保存在照片中并尝试从那里访问它。或者,您可以在使用提供的图像后使用该图像。

当用户第一次尝试访问照片时,会提示照片权限。当用户在应用程序启动后第一次尝试访问照片时,会询问照片选择。

如果您有选择用户“有限选择”访问权限的情况。您可以检查当前的照片库选择并根据选择提醒用户。

switch PHPhotoLibrary.authorizationStatus() {
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization { [weak self] status in
                switch status {
                case .authorized:
                    self?.initPhotoLibrary()
                case .limited:
                    // Alert user to select all photos
                default:
                    self?.handleDeniedAlbumsAuthorization()
                }
            }
            
        case .authorized:
            self.initPhotoLibrary()
        case .limited:
            // Alert user to select all photos
        case .restricted: fallthrough
        case .denied:
            handleDeniedAlbumsAuthorization()
        }

还有额外的打嗝

这是基于自定义图像选择器逻辑的,本机图像选择器不应该是这种情况。

检查 PHPicker 的苹果文档: https ://developer.apple.com/documentation/photokit/delivering_a_great_privacy_experience_in_your_photos_app


推荐阅读