PHPickerViewController通过PHAsset加载视频

时间:2020-10-06 09:53:33

标签: ios phasset phphotolibrary phfetchoptions

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

        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应该直接加载这些资产。反正是有避免照片库许可的地方吗?

1 个答案:

答案 0 :(得分:1)

有没有避免照片库许可的地方?

是,有点:

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

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

在这种情况下,用户可以为您提供图像数据,仅此而已。选择器不在进程内,真正从库本身中获取的数据也没有,只是用户明确选择的图像。

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

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

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

相关问题