PHPickerViewController загружает видео через PHAsset
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 должен загрузить эти активы напрямую. Есть ли способ избежать разрешения библиотеки фотографий?
Ответы
Есть ли способ избежать разрешения библиотеки фотографий?
Да вроде как:
Изменить
PHPickerConfiguration(photoLibrary: photolibrary)наPHPickerConfiguration()Вы не использовать ,
assetIdentifierчтобы вернуться к библиотеке фотографий (это будет вnilлюбом случае)
В этом случае пользователь может предоставить вам данные изображения, но это все. Средство выбора находится вне процесса, и на самом деле никакие данные из самой библиотеки не поступают, просто изображение, явно выбранное пользователем.
Однако, если ваша цель действительно - вернуться в библиотеку фотографий и получить PHAsset, тогда у вас должно быть разрешение, поскольку теперь вы действительно пытаетесь исследовать библиотеку фотографий за кулисами в вашем приложении.
Что я делаю, когда мое приложение зависит от информации PHAsset, - это запрашиваю разрешение библиотеки фотографий (при необходимости) перед представлением средства выбора, и я не представляю средство выбора, если не могу получить разрешение. Итак, пользователь нажимает кнопку, я обнаруживаю, что у нас нет разрешения, я прошу разрешения, мы его получаем (скажем), и я представляю средство выбора (выполняя асинхронный танец, потому что разрешение приходит асинхронно). Выглядит отлично.
Кстати, то же самое и с UIImagePickerController.