Как получить живое фото или видео из делегата PHPickerViewController

Новый делегат iOS 14 PHPickerViewController от Apple получает только NSItemProvider. Видео WWDC 2020 года показывает, как перейти оттуда к UIImage:

    let prov = result.itemProvider
    prov.loadObject(ofClass: UIImage.self) { im, err in
        if let im = im as? UIImage {
            DispatchQueue.main.async {
                // display the image here

Но что, если пользователь выбрал живое фото или видео? Как нам это получить?


person matt    schedule 13.08.2020    source источник


Ответы (1)


Живые фотографии легко; сделать это точно так же. Вы можете сделать это, потому что PHLivePhoto — это класс. Так:

    let prov = result.itemProvider
    prov.loadObject(ofClass: PHLivePhoto.self) { livePhoto, err in
        if let photo = livePhoto as? PHLivePhoto {
            DispatchQueue.main.async {
                // display the live photo here

Видео сложнее. Проблема в том, что вы не хотите, чтобы вам передавали данные; это не приносит вам пользы и, вероятно, будет огромным. Вы хотите, чтобы данные были сохранены на диск, чтобы вы могли получить доступ к URL-адресу видео, как это делал UIImagePickerController. На самом деле вы можете попросить поставщика элементов сохранить его данные для вас, но он захочет отпустить эти данные, когда обработчик завершения вернется. Мое решение - получить доступ к URL-адресу в функции .sync:

    let prov = result.itemProvider
    prov.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { url, err in
        if let url = url {
            DispatchQueue.main.sync {
                // display the video here
person matt    schedule 13.08.2020
comment
Мне интересно, почему PHPickerViewController не обрабатывает прямые ссылки на PHAsset для создания видео AVAsset, которое можно воспроизводить или экспортировать? Когда я выбираю элементы и загружаю выбранные PHAssets, он запрашивает разрешение для библиотеки фотографий. Но зачем это нужно, если пользователь уже выбрал эти элементы в средстве выбора? - person Deepak Sharma; 06.10.2020
comment
@DeepakSharma Пожалуйста, задайте это как отдельный вопрос. - person matt; 06.10.2020