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

如何通过PhotosPicker获取视频的原始创建日期

解决PhotosPicker无法获取视频原始创建日期的问题

你遇到的问题本质是:通过FileManager获取的是系统临时复制文件的创建时间,而非视频本身的原始拍摄/创建日期。要拿到原始日期,必须借助PhotoKit读取照片库中对应资源的元数据,而非仅读取临时文件属性。

解决方案步骤

  1. 导入Photos框架:使用PhotoKit的API获取媒体资源元数据
  2. 请求照片库访问权限:确保App拥有读取照片库的权限(需在Info.plist中添加权限描述)
  3. 通过PhotosPickerItem的assetIdentifier关联PHAsset:利用选中项的唯一标识获取对应的PHAsset,从中提取原始创建日期

修改后的完整代码示例

import SwiftUI
import PhotosUI
import Photos // 新增导入Photos框架

struct ContentView: View {
  
  @State var showPicker = false
  @State var selectedItem: PhotosPickerItem?
  
  var body: some View {
    VStack {
      Button("PHPicker") {
        showPicker.toggle()
      }
      .photosPicker(isPresented: $showPicker, selection: $selectedItem, matching: .videos)
      .padding()
      .onChange(of: selectedItem) { newValue in
        guard let newValue = newValue else { return }
        Task {
          // 1. 获取视频原始创建日期
          if let assetID = newValue.assetIdentifier {
            await requestPhotoLibraryPermission()
            let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [assetID], options: nil)
            if let asset = fetchResult.firstObject {
              print("视频原始创建日期:\(asset.creationDate ?? Date())")
            }
          }
          
          // 2. 原有加载视频文件的逻辑
          do {
            let pickedMovie = try await newValue.loadTransferable(type: VideoPickerTransferable.self)
          } catch {
            print("加载视频失败:\(error)")
          }
        }
      }
    }
  }
  
  // 请求照片库访问权限
  private func requestPhotoLibraryPermission() async {
    let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)
    if status == .notDetermined {
      _ = await PHPhotoLibrary.requestAuthorization(for: .readWrite)
    }
  }
}

#Preview {
    ContentView()
}

struct VideoPickerTransferable: Transferable {
  let videoUrl: URL
  static var transferRepresentation: some TransferRepresentation {
    FileRepresentation(contentType: .movie) { exportingFile in
      return .init(exportingFile.videoUrl)
      
    } importing: { receivedTransferredFile in
      let originalFile = receivedTransferredFile.file
      // 这里打印的是临时文件的创建时间(复制时刻),不是原始日期
      print("临时文件创建时间:\(try FileManager.default.attributesOfItem(atPath: originalFile.path())[FileAttributeKey.creationDate] ?? Date())")
      let copiedFile = URL.documentsDirectory.appending(path: "videoPicker.mov")
      
      if FileManager.default.fileExists(atPath: copiedFile.path()) {
        try FileManager.default.removeItem(at: copiedFile)
      }
      
      try FileManager.default.copyItem(at: originalFile, to: copiedFile)
      
      return .init(videoUrl: copiedFile)
    }
  }
}

关键说明

  • 权限配置:需要在Info.plist中添加NSPhotoLibraryUsageDescription(或iOS 14+的NSPhotoLibraryReadWriteUsageDescription),描述App访问照片库的原因,否则权限请求会被拒绝。
  • PHAsset的creationDate:该字段存储的是媒体资源的原始创建/拍摄日期,而非系统复制临时文件的时间,这正是你需要的原始日期。
  • assetIdentifier的作用:PhotosPickerItem的assetIdentifier对应照片库中资源的唯一标识,通过它可以精准定位到对应的PHAsset,进而获取元数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:44:52