UIImagePickerController仅取Live Photo崩溃,PHPhotosPicker为何正常?
我想从相册中仅获取Live Photo用于处理任务,但以下UIImagePickerController代码运行时崩溃:
let imagePicker = UIImagePickerController() imagePicker.sourceType = .photoLibrary //imagePicker.mediaTypes = [kUTTypeImage, kUTTypeLivePhoto] as [String] imagePicker.mediaTypes = [kUTTypeLivePhoto] as [String] imagePicker.delegate = self present(imagePicker, animated: true, completion: nil)
错误信息:
NSInvalidArgumentException, reason: 'The Live Photo type cannot be specified without the Image media type'
但在iOS 16+的SwiftUI中使用PHPhotosPicker却能成功仅获取Live Photo:
PhotosPicker(selection: $viewModel.imageSelection, matching: .livePhotos, photoLibrary: .shared())
想了解前者代码存在什么问题?
UIImagePickerController的API限制
UIImagePickerController是比较老旧的系统相册选择API,它设计上就把Live Photo当成特殊类型的图片,所以必须同时声明普通图片类型(kUTTypeImage)和Live Photo类型(kUTTypeLivePhoto),不能单独只指定后者。这就是你直接设置[kUTTypeLivePhoto]时崩溃的核心原因——这个API强制要求必须包含普通图片类型,才能开启Live Photo的选择权限。
PhotosPicker的底层差异
SwiftUI的PhotosPicker是iOS 16才推出的新API,它底层用的是更先进的PhotoKit框架,和UIImagePickerController的旧逻辑完全不同。PhotoKit对媒体类型的分类更细致,支持直接筛选仅Live Photo,不需要依赖普通图片类型的声明,所以可以直接用.livePhotos来匹配。
UIImagePickerController的可行解决办法
如果一定要用UIImagePickerController,只能先同时包含两种媒体类型:
imagePicker.mediaTypes = [kUTTypeImage, kUTTypeLivePhoto] as [String]
然后在代理方法里,判断选中的是不是Live Photo,过滤掉普通图片就行:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 只处理Live Photo if let livePhoto = info[.livePhoto] as? PHLivePhoto { // 在这里处理你的Live Photo任务 } }
内容的提问来源于stack exchange,提问作者AnupamChugh

