如何使用PhotosPicker获取原始视频创建日期

问题描述 投票:0回答:1

我在使用 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)
    }
  }
}
swift swiftui photospicker
1个回答
0
投票

您可以使用

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)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.