PHPickerViewController允许访问照片库资产的副本,以及返回结果中的PHAssets。要获得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应该直接加载这些资产。是否存在避免照片库许可的问题?
发布于 2020-10-06 15:21:58
是否有避免照片库许可的地方?
是的,算是:
PHPickerConfiguration()
PHPickerConfiguration(photoLibrary: photolibrary)改为PHPickerConfiguration(photoLibrary: photolibrary)assetIdentifier返回照片库(无论如何都是nil )在这种情况下,用户可以提供图像数据,但仅此而已。选择程序没有进程,并且没有真正从库本身获得的数据,只是用户显式选择的图像。
但是,如果您的目标确实是返回到照片库并获得PHAsset,那么您必须获得许可,因为您现在确实试图在应用程序的幕后探索照片库。
当我的应用程序依赖于PHAsset信息时,我所做的是在呈现选择器之前请求照片库许可(如果需要的话),如果不能获得许可,我就不提供选择器。因此,用户点击一个按钮,我发现我们没有权限,我请求许可,我们得到它(比如说),我呈现选择器(执行异步舞蹈,因为权限是异步到达的)。真不错。
顺便说一句,UIImagePickerController也是如此。
https://stackoverflow.com/questions/64223430
复制相似问题