Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在使用UIDocumentPickerViewController时,是否有办法保留原始拾取文件的资本化?_Ios_Swift_Url_Capitalization_Uidocumentpickerviewcontroller - Fatal编程技术网

Ios 在使用UIDocumentPickerViewController时,是否有办法保留原始拾取文件的资本化?

Ios 在使用UIDocumentPickerViewController时,是否有办法保留原始拾取文件的资本化?,ios,swift,url,capitalization,uidocumentpickerviewcontroller,Ios,Swift,Url,Capitalization,Uidocumentpickerviewcontroller,我正在开发的iOS 14 SwiftUI应用程序有两种导入其播放的音频文件的方法:用户可以打开UIDocumentPickerViewController并选择可在手机上访问的音频文件(例如,在其Dropbox中的一个),或者通过AirDrop将音频文件传输到应用程序 我在手机上运行应用程序,而不是在模拟器上 我的Dropbox中有一个文件,文件名显示为“09 The Chant of The Tuxedos.mp3”。当我打开我的应用程序的文件选择器时,文件名在Dropbox中显示为大写。然而

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

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

我的Dropbox中有一个文件,文件名显示为“09 The Chant of The Tuxedos.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
...
以下是我的文档选择器的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和查阅文件元数据来了解文件名的原始大小写,但我认为在您的情况下没有办法做到这一点。

如果您在其他地方(如我的手机上)的文件上运行相同的代码,则不会出现此问题。DropBox导致了这个问题。@matt,你能把这个贴出来吗?这样我就可以标记为答案了?自从你发表评论以来,我看到了多个Dropbox社区帖子,证实了你的诊断。是的,很高兴这么做。
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
}