问题描述
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应该直接加载这些资产。反正是有避免照片库许可的地方吗?
解决方法
有没有避免照片库许可的地方?
是,有点:
-
将
PHPickerConfiguration(photoLibrary: photolibrary)
更改为PHPickerConfiguration()
-
不要不使用
assetIdentifier
返回照片库(无论如何它都会是nil
)
在这种情况下,用户可以为您提供图像数据,仅此而已。选择器不在进程内,真正从库本身中获取的数据也没有,只是用户明确选择的图像。
但是,如果您的目标确实是返回图片库并获取PHAsset,那么您必须获得许可,因为您现在确实在尝试探查照片。应用内幕后的照片库。
当我的应用程序依赖于PHAsset信息时,我要做的是在展示选择器之前,请求照片库许可(如果需要)。如果可以,我不显示选择器。没有获得许可。因此,用户点击一个按钮,我发现我们没有权限,我请求权限,我们得到了它(比如说),我展示了选择器(进行异步跳舞,因为权限是异步到达的)。看起来很棒。
顺便说一句,UIImagePickerController也是如此。