Как получить PHAsset из PHPicker?

В WWDC20 Apple представила PHPicker - современную замену UIImagePickerController.
Мне интересно, можно ли получить PHAsset с помощью нового средства выбора фотографий?


Вот мой код:

 private func presentPicker(filter: PHPickerFilter) {
        var configuration = PHPickerConfiguration()
        configuration.filter = filter
        configuration.selectionLimit = 0
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        present(picker, animated: true)
    }


func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        dismiss(animated: true)
        
        
    }

1 ответ

Решение

Мне удалось найти ответ от разработчиков этого фреймворка на яблочном форуме:

Да, PHPickerResult имеет свойство assetIdentifier, которое может содержать локальный идентификатор для выборки PHAsset из библиотеки. Чтобы PHPicker возвращал идентификаторы активов, вам необходимо инициализировать PHPickerConfiguration с помощью библиотеки.

Обратите внимание, что PHPicker не расширяет доступ к ограниченной библиотеке фотографий для выбранных элементов, если пользователь переводит ваше приложение в режим ограниченной библиотеки фотографий. Было бы неплохо подумать, действительно ли приложению нужен прямой доступ к библиотеке фотографий или оно может работать только с изображениями и видео. Но это действительно зависит от приложения.

Соответствующий раздел сеанса "Знакомьтесь с новым сборщиком фотографий" начинается в 10.20.

Пример кода для доступа к PhotoKit выглядит так:

import UIKit
import PhotosUI
class PhotoKitPickerViewController: UIViewController, PHPickerViewControllerDelegate {
        @IBAction func presentPicker(_ sender: Any) {
                let photoLibrary = PHPhotoLibrary.shared()
                let configuration = PHPickerConfiguration(photoLibrary: photoLibrary)
                let picker = PHPickerViewController(configuration: configuration)
                picker.delegate = self
                present(picker, animated: true)
        }
        
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
                picker.dismiss(animated: true)
                
                let identifiers = results.compactMap(\.assetIdentifier)
                let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: identifiers, options: nil)
                
                // TODO: Do something with the fetch result if you have Photos Library access
        }
}
Другие вопросы по тегам