如何从 PHPicker 中检索 PHAsset?

Posted

技术标签:

【中文标题】如何从 PHPicker 中检索 PHAsset?【英文标题】:How to retrieve PHAsset from PHPicker? 【发布时间】:2020-06-28 17:11:59 【问题描述】:

WWDC20 中,苹果推出了 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】:

我设法在apple forum 上从这个框架的开发者那里找到了答案:

是的,PHPickerResult 具有assetIdentifier 属性,它可以包含 从库中获取 PHAsset 的本地标识符。具有 PHPicker 返回资产标识符,需要初始化 PHPickerConfiguration 与库。

请注意 PHPicker 不会扩展有限的照片库 如果用户将您的应用置于受限状态,则可以访问所选项目 照片库模式。这将是一个重新考虑的好机会 该应用程序确实需要直接访问照片库或可以使用 只是图像和视频数据。但这真的取决于应用程序。

“认识新的照片选择器”会话的相关部分 开始于10m 20s。

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
        

【讨论】:

感谢您报告此事,在 SO 上善用自我 Q 和 A。 是否可以直接从 ItemProvider 获取一些元数据(如照片拍摄日期)?或者只要我们需要元数据,我们就需要通过 PHAsset? 是否有其他人遇到 fetchResult 始终为空的问题? compactMap 工作,我得到标识符,但提取结果从不为我返回任何结果。 @JKoko 记得在PHPickerConfiguration 中设置PHPhotoLibrary.shared() 我遇到了同样的问题。 @JKoko 你找到解决办法了吗?

以上是关于如何从 PHPicker 中检索 PHAsset?的主要内容,如果未能解决你的问题,请参考以下文章

从文件 URL 中检索 ALAsset 或 PHAsset

如何检索 PHAsset 的元数据?

如何从 MacOS 的照片库中获取所有 PHAsset

PHAsset,如何在应用重启后检索特定的 PHAsset 对象(ios8 Photos)

如何修改PHPicker的外观

如何从 UIImagePickerController 获取图像文件名