You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIImagePickerController仅取Live Photo崩溃,PHPhotosPicker为何正常?

问题:UIImagePickerController仅选择Live Photo时崩溃,但SwiftUI的PhotosPicker可正常实现

我想从相册中仅获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:07:17