4

PHPickerViewController 允许访问照片库资产的副本以及在结果中返回 PHAsset。要获取 PHAssets 而不是文件副本,我会:

        let photolibrary = PHPhotoLibrary.shared()
        var configuration = PHPickerConfiguration(photoLibrary: photolibrary)
        configuration.filter = .videos
        configuration.selectionLimit = 0
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        self.present(picker, animated: true, completion: nil)

接着,

 //MARK:- PHPickerViewController delegate

@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    
    picker.dismiss(animated: true) {
        let identifiers:[String] = results.compactMap(\.assetIdentifier)
        let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)
        
        NSLog("\(identifiers), \(fetchResult)")
    }
    
}

但问题是,一旦照片选择器被关闭,它会提示对照片库的访问,这令人困惑,并且由于用户无论如何都隐含地授予了对 PHPickerViewController 中选定资产的访问权限,PHPhotoLibrary 应该直接加载这些资产。有没有办法避免照片库权限?

4

1 回答 1

4

有没有办法避免照片库权限?

是的,有点:

  1. 更改PHPickerConfiguration(photoLibrary: photolibrary)PHPickerConfiguration()

  2. 不要使用assetIdentifier返回照片库(无论如何nil都会)

在这种情况下,用户可以为您提供图像数据,仅此而已。选择器是进程外的,并且没有真正遇到来自库本身的数据,只是用户明确选择的图像。

但是,如果您的目标确实返回照片库并获取 PHAsset,那么您必须获得许可,因为您现在确实是在尝试在应用程序的幕后探查照片库。

当我的应用程序依赖于 PHAsset 信息时,我所做的是在展示选择器之前请求照片库许可(如果需要) ,如果我无法获得许可,我不会展示选择器。所以,用户点击一个按钮,我发现我们没有权限,我请求权限,我们得到它(比方说),我展示了选择器(做异步舞蹈,因为权限是异步到达的)。看起来很棒。

顺便说一句,UIImagePickerController 也是如此。

于 2020-10-06T15:21:58.887 回答