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

如何让通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:12:39