问题描述
为了获取照片的creationDate,请在显示PHPickerViewController之前使用requestAuthorizationForAccessLevel。
PHAccessLevel level = PHAccessLevelReadWrite;
[PHPhotoLibrary requestAuthorizationForAccessLevel:level handler:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusLimited || status == PHAuthorizationStatusAuthorized) {
dispatch_async(dispatch_get_main_queue(),^{
PHPickerConfiguration *configuration = [[PHPickerConfiguration alloc] initWithPhotoLibrary:[PHPhotoLibrary sharedPhotoLibrary]];
configuration.filter = [PHPickerFilter imagesFilter];
configuration.selectionLimit = 1;
PHPickerViewController *picker = [[PHPickerViewController alloc] initWithConfiguration:configuration];
picker.delegate = self;
[self showViewController:picker sender:nil];
});
}
}];
尽管状态为.limited,但iOS 14仍显示所有图像。
如何使用PHPickerViewController仅获取有限的照片?
解决方法
所以iOS 14中发生了一些变化,让我们一步一步地了解
1。如何读取PHPhotoLibrary访问权限状态
旧
let status = PHPhotoLibrary.authorizationStatus()
新
let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)
2。如何请求PHPhotoLibrary访问权限
旧
PHPhotoLibrary.requestAuthorization { status in
//your code
}
新
PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
switch status {
case .limited:
print("limited access granted")
default:
print("denied,.restricted,.authorized")
}
}
在用户授予您有限权限的情况下,您有责任像下面的示例代码一样显示图库
if status == .limited {
PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: self)
}
当您呈现LimitedLibraryPicker时,上一个会话中选择的图像将被标记为选中,并且屏幕上方还会显示一条消息-“ 选择更多照片或取消选择以删除访问权限”
在用户授予您有限访问权限的情况下,您仍然可以使用UIImagePickerController或BSImagePicker之类的第三方库来展示普通画廊,即使您可以选择并导入到您的应用中,也将显示包含所有图片的画廊,但是在Xcode 12控制台中它会显示以下警告
Failed to decode image
[ImageManager] Failed to get sandbox extension for url: file///filepath/5003.JPG,error: Error Domain=com.apple.photos.error Code=41008 "Invalid asset uuid for client" UserInfo={NSLocalizedDescription=Invalid asset uuid for client}