Как получить 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
}
}