Как использовать PHAuthorizationStatusLimited в iOS 14

#ios14 #phpickerviewcontroller

#ios14 #phpickerviewcontroller

Вопрос:

Чтобы получить дату создания фотографии, поэтому используйте requestAuthorizationForAccessLevel перед показом PHPickerViewController.

     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?

Комментарии:

1. Что это значит: я получаю все фотографии, даже если изначально выбираю ограниченное количество фотографий

2. хотя статус ограничен, но iOS 14 по-прежнему отображает все изображения

3. Я сталкиваюсь с той же проблемой…

4. Я также сталкиваюсь с той же проблемой. Любое решение для этого.

Ответ №1:

Итак, пара вещей была изменена в 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}
  

Комментарии:

1. Отлично, это действительно полезно, я не знал о новой авторизации .ReadWrite. Без этого .ограниченный случай никогда не запускался. Но это не отвечает только на вопрос «как получить ограниченную коллекцию фотографий»

2. получая ограниченную коллекцию фотографий, вы должны управлять самостоятельно, например, хранить эти фотографии в локальной базе данных, есть хорошо написанная статья, ознакомьтесь с ней wwdcnotes.com/notes/wwdc20/10641

3. Хорошо, но ваше решение подразумевает создание нашего собственного средства выбора фотографий для отображения только ограниченной коллекции фотографий. Это именно то поведение, от которого я хочу избавиться, используя PHPickerViewController

4. Да, в конечном итоге мы также использовали PHPickerViewController, ранее мы использовали библиотеку BSImagePicker только для того, чтобы разрешить пользователю выбирать несколько изображений, теперь PHPickerViewController позволяет пользователю выбирать несколько изображений, кроме того, вам даже не нужно спрашивать разрешение на доступ к галерее