如何让通过Swift Photos框架保存的视频成为iOS照片库最新项?
解决Photos框架保存旧视频不显示为最新项的问题
问题根源在于PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL:)会默认读取视频文件本身的创建/修改时间,作为相册中资产的排序时间,所以旧文件会被排在已有新内容的后面。下面提供两种可行的解决方法:
方法一:修改原视频文件的时间属性
直接把视频文件的创建和修改时间改成当前时间,再执行保存操作,Photos会用修改后的时间作为资产时间,让视频排在最新位置:
let fileManager = FileManager.default do { let currentTime = Date() // 修改文件的创建和修改时间为当前时间 try fileManager.setAttributes([ FileAttributeKey.creationDate: currentTime, FileAttributeKey.modificationDate: currentTime ], ofItemAtPath: url.path) } catch { print("修改文件时间出错:\(error.localizedDescription)") } // 执行保存 PHPhotoLibrary.shared().performChanges { PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url) } completionHandler: { success, error in if let err = error { print("保存视频失败:\(err.localizedDescription)") } }
注意:这种方法会改动原文件的属性,如果原文件需要保留原始时间,不建议用这个方法。
方法二:手动设置资产的创建时间(推荐)
使用PHAssetCreationRequest创建资产,手动指定资产的创建时间为当前时间,同时导入视频数据,不需要修改原文件:
PHPhotoLibrary.shared().performChanges { let creationRequest = PHAssetCreationRequest.forAsset() // 强制设置资产的创建时间为当前时间 creationRequest.creationDate = Date() // 读取视频文件数据并添加到请求中 do { let videoData = try Data(contentsOf: url) creationRequest.addResource(with: .video, data: videoData, options: nil) } catch { print("读取视频数据失败:\(error.localizedDescription)") } } completionHandler: { success, error in if let err = error { print("保存视频失败:\(err.localizedDescription)") } }
这种方法更灵活,不会改动原文件,适合大多数场景。
内容的提问来源于stack exchange,提问作者Kuldeep Tanwar
相关产品推荐
相关产品推荐

