如何通过PhotosPicker获取视频的原始创建日期
解决PhotosPicker无法获取视频原始创建日期的问题
你遇到的问题本质是:通过FileManager获取的是系统临时复制文件的创建时间,而非视频本身的原始拍摄/创建日期。要拿到原始日期,必须借助PhotoKit读取照片库中对应资源的元数据,而非仅读取临时文件属性。
解决方案步骤
- 导入Photos框架:使用PhotoKit的API获取媒体资源元数据
- 请求照片库访问权限:确保App拥有读取照片库的权限(需在
Info.plist中添加权限描述) - 通过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
相关产品推荐
相关产品推荐

