如何从 PHPickerViewController 委托中获取实时照片或视频

How to fetch live photo or video from PHPickerViewController delegate

Apple 的新 iOS14 PHPickerViewController 委托仅接收一个 NSItemProvider。 2020 WWDC 视频展示了如何从那里获得 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

但是如果用户选择了实时照片或视频呢?我们如何得到它?

现场照片很容易;以完全相同的方式做。您可以这样做,因为 PHLivePhoto 是 class。所以:

    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 过去所做的那样。事实上,您可以要求项目提供者为您保存其数据,但它希望在完成处理程序 returns 时放弃该数据。我的解决方案是在 .sync 函数中访问 URL:

    let prov = result.itemProvider
    prov.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { url, err in
        if let url = url {
            DispatchQueue.main.sync {
                // display the video here