如何使用iOS 14中的PHAuthorizationStatusLimited

问题描述

为了获取照片的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时,上一个会话中选择的图像将被标记为选中,并且屏幕上方还会显示一条消息-“ 选择更多照片或取消选择以删除访问权限

enter image description here

在用户授予您有限访问权限的情况下,您仍然可以使用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}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...