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
相关产品推荐
相关产品推荐

