PHPickerViewController загружает видео через PHAsset

Oct 06 2020

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 должен загрузить эти активы напрямую. Есть ли способ избежать разрешения библиотеки фотографий?

Ответы

2 matt Oct 06 2020 at 15:21

Есть ли способ избежать разрешения библиотеки фотографий?

Да вроде как:

  1. Изменить PHPickerConfiguration(photoLibrary: photolibrary)наPHPickerConfiguration()

  2. Вы не использовать , assetIdentifierчтобы вернуться к библиотеке фотографий (это будет в nilлюбом случае)

В этом случае пользователь может предоставить вам данные изображения, но это все. Средство выбора находится вне процесса, и на самом деле никакие данные из самой библиотеки не поступают, просто изображение, явно выбранное пользователем.

Однако, если ваша цель действительно - вернуться в библиотеку фотографий и получить PHAsset, тогда у вас должно быть разрешение, поскольку теперь вы действительно пытаетесь исследовать библиотеку фотографий за кулисами в вашем приложении.

Что я делаю, когда мое приложение зависит от информации PHAsset, - это запрашиваю разрешение библиотеки фотографий (при необходимости) перед представлением средства выбора, и я не представляю средство выбора, если не могу получить разрешение. Итак, пользователь нажимает кнопку, я обнаруживаю, что у нас нет разрешения, я прошу разрешения, мы его получаем (скажем), и я представляю средство выбора (выполняя асинхронный танец, потому что разрешение приходит асинхронно). Выглядит отлично.

Кстати, то же самое и с UIImagePickerController.