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

保存RAW照片及Alternate Photo到iOS相册时触发Error 3300问题

排查iOS保存RAW+备用照片触发Error 3300的问题

Error 3300对应PHPhotosErrorResourceValidationFailed,核心原因是Photos库对添加的资源验证不通过,结合你的场景,可从以下几个方向排查:

1. 检查备用照片的数据格式

iOS要求.alternatePhoto必须是系统兼容的标准图像数据(如HEIF、JPEG),且需与主RAW照片的元数据匹配:

  • 确认alterPhoto是通过UIImageJPEGRepresentation/UIImageHEIFRepresentation生成的有效编码数据,或是系统相机捕获的标准压缩图像数据。
  • 避免直接使用未经编码的位图数据(比如CIImage转Data时未指定正确格式)。

2. 修正代码中的冗余变量定义

你的代码在performChanges闭包内重复定义了options变量,虽不直接触发错误,但易引发逻辑混淆,建议统一变量:

PHPhotoLibrary.shared().performChanges{
    let creationRequest = PHAssetCreationRequest.forAsset()
    let options = PHAssetResourceCreationOptions()
    options.shouldMoveFile = true
    // 添加主RAW资源
    creationRequest.addResource(with: .photo, fileURL: self.rawFileURL!, options: options)
    // 添加备用照片
    if let alternateData = alterPhoto {
        creationRequest.addResource(with: .alternatePhoto, data: alternateData, options: nil)
    }
} completionHandler: { success, error in
    if let error = error {
        print("保存失败:\(error.localizedDescription)")
    }
}

3. 确认RAW文件的有效性

确保rawFileURL指向标准DNG格式文件,且文件未损坏、权限正常:

  • 手动打开该RAW文件,确认能被系统Photos应用识别。
  • 检查shouldMoveFile设置:若文件在App沙盒外,确保App有读取权限;沙盒内文件使用shouldMoveFile=true可避免重复占用空间。

4. 注意官方示例的笔误

你贴出的官方示例代码存在逻辑错误(creationRequest在使用后才定义),无需照搬,你的代码中先创建请求再添加资源的逻辑是正确的。

额外验证步骤

  • 尝试单独保存备用照片为普通照片,确认数据本身无问题。
  • 可为备用照片指定明确的类型标识符,帮助Photos库正确识别:
if let alternateData = alterPhoto {
    let alternateOptions = PHAssetResourceCreationOptions()
    alternateOptions.uniformTypeIdentifier = kUTTypeHEIF as String
    creationRequest.addResource(with: .alternatePhoto, data: alternateData, options: alternateOptions)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:25:34