我在使用 PhotosPicker 导入视频时尝试获取原始视频文件创建日期,但无法获取除新复制文件的创建日期以外的任何内容,该日期始终是文件导入的时刻。
我尝试了使用 PhotosPicker 的各种方法,但在获取实际日期方面没有取得任何成功。我还尝试使用 PHPhotoPicker 和 UIImagePicker 获取原始视频创建日期,并得到了相同的结果。它应该非常容易获得,但我在任何地方都找不到示例。
这是一个最小的例子:
import SwiftUI
import PhotosUI
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
if let newValue {
Task {
do {
let pickedMovie = try await newValue.loadTransferable(type: VideoPickerTransferable.self)
}
}
}
}
}
}
}
#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])
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)
}
}
}
photosPicker
的再现,它采用 photoLibrary
参数。当您执行此操作时,PhotosPickerItem
将包含一个 itemIdentifier
,您可以将其与 PHAsset.fetchAssets
一起使用:
struct ContentView: View {
@State var showPicker = false
@State var selectedItem: PhotosPickerItem?
var body: some View {
VStack {
Button("Photo picker") {
showPicker.toggle()
}
.photosPicker(
isPresented: $showPicker,
selection: $selectedItem,
matching: .videos,
photoLibrary: PHPhotoLibrary.shared()
)
.padding()
.onChange(of: selectedItem) {
guard
let identifier = selectedItem?.itemIdentifier,
let asset = PHAsset.fetchAssets(
withLocalIdentifiers: [identifier],
options: nil
).firstObject,
let creationDate = asset.creationDate
else {
print("unable to fetch date")
return
}
print(creationDate)
}
}
}
}