使用UIDocumentPickerViewController时是否可以保留原始选取文件的大小写?

问题描述

我正在开发的iOS 14 SwiftUI应用有两种导入播放音频文件的方式:用户可以打开UIDocumentPickerViewController并选择可以在手机上访问的音频文件(例如,在DropBox中访问一个音频文件),或者可以传输通过AirDrop将音频文件发送到应用。

我正在手机上而不是模拟器上运行该应用程序。

我的DropBox中有一个文件文件显示为“ 09 The Tutedos.mp3的颂歌”。当我打开应用程序的文件选择器时,文件名会在DropBox中以大写字母出现。但是,当我选择它时,当我的文档选择器协调器的didPickDocumentsAt例程获取URL时,该文件名似乎失去了大写字母。

   class Coordinator: NSObject,UIDocumentPickerDelegate,UINavigationControllerDelegate {
    var parent: FilePicker
    
    init(_ parent: FilePicker){
        self.parent = parent
    }
        
        func documentPicker(_ controller: UIDocumentPickerViewController,didPickDocumentsAt urls: [URL]) {

            guard let url = urls.first,url.startAccessingSecurityScopedResource() else {
                return
            }
            parent.soundURL = url
...

此时调用po url会产生:

file:///private/var/mobile/Containers/Shared/AppGroup/6032207B-36E4-464C-99F5-8448D1E62174/File%20Provider%20Storage/125859280/local-storage/L21wMy8wOSB0aGUgY2hhbnQgb2YgdGhlIHR1eGVkb3MubXAz/09%20the%20chant%20of%20the%20tuxedos.mp3
- _url : file:///private/var/mobile/Containers/Shared/AppGroup/6032207B-36E4-464C-99F5-8448D1E62174/File%20Provider%20Storage/125859280/local-storage/L21wMy8wOSB0aGUgY2hhbnQgb2YgdGhlIHR1eGVkb3MubXAz/09%20the%20chant%20of%20the%20tuxedos.mp3

另一方面,如果我将同一DropBox文件从我的计算机中空投到我的应用程序中,则会保留文件名大写。

在SceneDelegate.swift中,我有

func scene(
  _ scene: UIScene,openURLContexts URLContexts: Set<UIOpenURLContext>
) {

  guard let urlContext = URLContexts.first else {
    return
  }
  let fm = FileManager.default
...

po urlContext此时产生

<UIOpenURLContext: 0x2830c5000; URL: file:///private/var/mobile/Containers/Data/Application/D7D6E213-C661-4960-A31D-310B31615B3E/Documents/InBox/09%20The%20Chant%20Of%20The%20Tuxedos.mp3; options: <UISceneOpenURLOptions: 0x283e953e0; sourceApp: (null); annotation: (null); openInPlace: NO>>

以下是我的文档选择器的makeCoordinator()和makeUIViewController函数

func makeCoordinator() -> Coordinator {
     return Coordinator(self)
 }

func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
    
    let supportedTypes: [UTType] = [UTType.audio]
    let picker = UIDocumentPickerViewController(foropeningContentTypes: supportedTypes,ascopy: false)
    picker.shouldShowFileExtensions = true          // Sigh - quite pointless,it turns out
    picker.delegate = context.coordinator
    picker.allowsMultipleSelection = false
    return picker
}

是否可以通过UIDocumentPickerViewController(或通过任何其他方式)选择一个音频文件来保留原始文件的大写字母?

解决方法

如果您在其他位置的文件(例如“在我的手机上”)上运行相同的代码,则不会出现此问题。 Dropbox本身就是问题所在。

我了解到,您可以使用Dropbox API并参考文件元数据来学习文件名的原始大小写,但是我不认为有这种方法可以解决您的情况。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...