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

iOS保存图片至自定义相册报PHPhotosErrorDomain 3300错误求助

问题描述

在部分设备上执行「保存照片到自定义相册」操作时,会触发如下报错:

操作无法完成。(PHPhotosErrorDomain error 3300)。
错误码: 3300

触发问题的代码片段
PHPhotoLibrary.shared().performChanges({
    let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
    guard let placeholder = assetChangeRequest.placeholderForCreatedAsset else { return }
    let albumChangeRequest = PHAssetCollectionChangeRequest(for: album)
    albumChangeRequest?.addAssets([placeholder] as NSArray)
}, completionHandler: { success, error in
    completion(success, error)
})
排查与解决建议
  • 优先校验照片读写权限:iOS 14及以上版本支持有限照片权限模式,若App仅获得「选中照片」授权,或用户后续在系统设置中修改了权限、权限被系统临时回收,写入自定义相册时就会触发3300错误。不要仅在首次触发保存时校验权限,每次执行写入操作前都需要调用PHPhotoLibrary.authorizationStatus(for: .readWrite)确认当前权限为.authorized,权限不足时主动触发授权请求,有限权限场景下需引导用户开启完整读写权限。
  • 确认自定义相册实例有效性:不要使用缓存的相册对象执行写入操作,若用户手动删除了对应自定义相册、iCloud同步未完成导致相册未加载到本地、跨线程传递的PHAssetCollection对象失效,都会导致写入失败。每次执行写入前,先通过相册的localIdentifier调用PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [targetAlbumID], options: nil)拉取最新的相册实例,确认实例存在后再执行变更操作。
  • 拆分写入操作逻辑:不要把「保存图片到系统相册」和「把图片加入自定义相册」两个操作放在同一个performChanges块中执行。部分低性能设备或开启iCloud照片的场景下,新建Asset的placeholder还未完成系统侧初始化就被加入相册变更请求,会触发写入失败。可以先单独执行图片保存到系统相册的逻辑,拿到保存成功返回的Asset本地ID后,再开启新的performChanges块,拉取对应Asset实例添加到自定义相册。
  • 提升图片资源兼容性:直接传入UIImage创建Asset时,若图片未完成解码、HEIC格式在部分旧系统版本存在兼容问题,也会触发3300报错。可以在保存前先将图片转为JPEG格式数据,使用PHAssetCreationRequest.forAsset().addResource(with: .photo, data: jpegData, options: nil)的方式创建资源,兼容性比直接传入UIImage更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:45:31