You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

UIImagePickerController选savedPhotosAlbum不显示Live Photos及崩溃问题求助

嘿,咱们来解决你遇到的这个Live Photos问题——看起来你在配置媒体类型的时候踩了iOS 11特有的坑,这事儿挺常见的,我帮你梳理下可能遗漏的步骤:

1. 确认媒体类型的正确配置(最可能的崩溃原因)

首先,iOS里Live Photos对应的媒体类型是kUTTypeLivePhoto,但这个常量需要导入MobileCoreServices框架才能用,很多人会忘这一步导致崩溃。

如果你用Swift,要这样写:

import MobileCoreServices

// 同时包含普通图片和Live Photos
let allowedMediaTypes = [kUTTypeImage as String, kUTTypeLivePhoto as String]
imagePickerController.mediaTypes = allowedMediaTypes

如果是Objective-C,记得导入头文件:

#import <MobileCoreServices/MobileCoreServices.h>

别直接手写字符串"com.apple.live-photo",用系统常量才不会出错,而且iOS 11对这个的校验更严格,写错就会崩溃。

2. 检查Info.plist的权限配置

iOS 10及以上版本,访问照片库必须在Info.plist里添加权限描述,没加的话直接崩溃。你需要添加这两个键中的至少一个:

  • NSPhotoLibraryUsageDescription:说明为什么需要访问照片库(比如“需要访问相册来选择头像”)
  • NSPhotoLibraryAddUsageDescription:如果你的App需要保存照片到相册的话添加
3. 正确处理Live Photos的返回结果

当用户选了Live Photo,UIImagePickerController返回的结果里,对应的是PHLivePhoto对象,而不是普通的UIImage。如果你的代码里直接强制取UIImage,就会因为类型不匹配崩溃。

Swift里要这样处理:

import Photos

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    // 先判断是否是Live Photo
    if let livePhoto = info[.livePhoto] as? PHLivePhoto {
        // 这里处理Live Photo,比如用PHLivePhotoView显示
        // 如果只是要取静态图当头像,可以从livePhoto里提取
    } else if let normalImage = info[.originalImage] as? UIImage {
        // 处理普通图片
    }
    picker.dismiss(animated: true)
}

别忘了导入Photos框架,不然PHLivePhoto会找不到。

4. 版本兼容性校验(补充提醒)

kUTTypeLivePhoto是iOS 9.1之后才支持的,虽然你测试的是iOS11没问题,但如果你的App要兼容更早版本,得加版本判断:

var allowedMediaTypes = [kUTTypeImage as String]
if #available(iOS 9.1, *) {
    allowedMediaTypes.append(kUTTypeLivePhoto as String)
}
imagePickerController.mediaTypes = allowedMediaTypes
总结

你遇到的崩溃大概率是这几个原因:要么没导入MobileCoreServices框架就用了kUTTypeLivePhoto,要么没处理Live Photo的返回结果,要么Info.plist里缺权限描述。按上面的步骤排查,应该能解决问题。

内容的提问来源于stack exchange,提问作者ilikecode

火山引擎 最新活动