UIImagePickerController选savedPhotosAlbum不显示Live Photos及崩溃问题求助
嘿,咱们来解决你遇到的这个Live Photos问题——看起来你在配置媒体类型的时候踩了iOS 11特有的坑,这事儿挺常见的,我帮你梳理下可能遗漏的步骤:
首先,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对这个的校验更严格,写错就会崩溃。
iOS 10及以上版本,访问照片库必须在Info.plist里添加权限描述,没加的话直接崩溃。你需要添加这两个键中的至少一个:
NSPhotoLibraryUsageDescription:说明为什么需要访问照片库(比如“需要访问相册来选择头像”)NSPhotoLibraryAddUsageDescription:如果你的App需要保存照片到相册的话添加
当用户选了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会找不到。
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




