如何编程将视频保存至Photos指定相册 解决iCloud同步后Mac端相册归属异常
根因说明
该问题的核心原因是你获取的原视频所属相册为系统智能相册,这类相册的资产归属规则由系统自动维护,你通过API手动添加资产到智能相册的操作仅会在本地iOS设备生效,对应变更不会同步到iCloud,因此Mac端无法识别到该归属关系,只能在所有资源列表中找到压缩后的视频。
修复方案
1. 调整相册查询逻辑,仅查询用户自定义相册
修改步骤3.1的代码,明确指定查询类型为用户手动创建的自定义相册,排除系统智能相册:
let fetchOptions = PHFetchOptions() // with参数传入.album,仅查询用户创建的自定义相册,排除系统智能相册 let collection = PHAssetCollection.fetchAssetCollectionsContaining(fileAsset, with: .album, options: fetchOptions) // 先做空判断,避免崩溃 guard let assetCollection = collection.firstObject else { // 若原视频不在任何自定义相册,可自行补充降级逻辑,比如存到默认创建的压缩视频相册 return }
2. 优化资源创建参数,确保同步生效
修改步骤3.2的资源创建请求,显式声明资源可同步:
let creationRequest = PHAssetCreationRequest.forAsset() let resourceOptions = PHAssetResourceCreationOptions() resourceOptions.shouldMoveFile = false creationRequest.addResource(with: .video, fileURL: videoURL, options: resourceOptions)
3. 确保所有变更操作都包裹在PhotoLibrary变更闭包中
确认你的步骤3.2、3.3的代码都放在PHPhotoLibrary.shared().performChanges闭包内,所有变更操作完成后再触发iCloud同步:
PHPhotoLibrary.shared().performChanges { // 此处放置你的步骤3.2、3.3代码 } completionHandler: { success, error in if let error = error { print("相册操作失败: \(error.localizedDescription)") return } // 操作成功后可延迟1秒刷新图库状态,触发iCloud同步 DispatchQueue.main.asyncAfter(deadline: .now() + 1) { PHPhotoLibrary.shared().performChanges({}) { _, _ in } } }
验证方法
修改完成后重新测试:
- iOS端完成操作后,等待2-3分钟待iCloud同步完成
- 打开Mac端照片App,查看对应自定义相册,即可看到压缩后的视频已经出现在目标相册中
内容的提问来源于stack exchange,提问作者Phong Đằng
相关产品推荐
相关产品推荐

