iOS 15.1 调用 PHLivePhoto.request 无法生成 Live Photo 问题求助
问题根因
iOS 15.1 系统对 PHLivePhoto 的生成规则做了更严格的校验,原先iOS 15.0及以下版本兼容的不规范参数/配置,在15.1之后会直接返回空的Live Photo对象。
可行解决方案
- 修正资源数组顺序:
request(withResourceFileURLs:)方法的资源数组必须先传图片URL,再传视频URL,你现有代码顺序颠倒,这是最高发的触发原因。iOS 15.0及之前版本对顺序不做强制校验,15.1之后顺序错误会直接生成失败。 - 校验资源合规性:
- 图片和视频的分辨率必须完全匹配,像素误差不能超过1
- 视频时长需控制在1~3秒范围内,推荐为1.5秒
- 图片EXIF中的
ContentIdentifier字段值,必须和视频元数据中的com.apple.quicktime.content.identifier字段值完全一致
- 修正
targetSize参数:不要传CGSize.zero,15.1之后对零尺寸的处理逻辑有变更,建议传入和图片实际分辨率一致的尺寸,或直接传入UIScreen.main.bounds.size - 回调中增加错误判断,可通过
PHLivePhotoInfoErrorKey获取具体失败原因
修正后可运行代码
// 注意数组顺序:先图片,后视频 _ = PHLivePhoto.request(withResourceFileURLs: [pairedImageURL, pairedVideoURL], placeholderImage: nil, targetSize: UIScreen.main.bounds.size, contentMode: PHImageContentMode.aspectFit, resultHandler: { (livePhoto: PHLivePhoto?, info: [AnyHashable : Any]) -> Void in if let isDegraded = info[PHLivePhotoInfoIsDegradedKey] as? Bool, isDegraded { return } // 新增错误打印,方便排查问题 if let error = info[PHLivePhotoInfoErrorKey] as? Error { print("Live Photo生成失败:\(error.localizedDescription)") DispatchQueue.main.async { completion(nil, (pairedImageURL, pairedVideoURL)) } return } DispatchQueue.main.async { completion(livePhoto, (pairedImageURL, pairedVideoURL)) } })
内容的提问来源于stack exchange,提问作者David Wang
相关产品推荐
相关产品推荐

