有没有办法在使用 UIDocumentPickerViewController 时保留原始选择文件的大写?
Is there a way to preserve capitalisation of original picked file while using UIDocumentPickerViewController?
我正在开发的 iOS 14 SwiftUI 应用程序有两种导入它播放的音频文件的方法:用户可以打开一个 UIDocumentPickerViewController 和 select 一个可以在他们的 phone 上访问的音频文件(例如,他们的 Dropbox 中的一个),或者他们可以通过 AirDrop 将音频文件传输到应用程序。
我是 运行 我 phone 上的应用程序,而不是模拟器上的应用程序。
我的 Dropbox 中有一个文件,其文件名显示为“09 The Chant of the Tuxedos.mp3”。当我打开我的应用程序的文件选择器时,文件名会在 Dropbox 中以这种大写形式显示。然而,当我 select 它时,当我的文档选择器协调器的 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 文件从我的计算机 AirDrop 到我的应用程序,则文件名大写会被保留。
在 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(或任何其他方式)选择一个音频文件来保留原始文件的大写字母吗?
如果您 运行 在其他地方的文件中使用相同的代码,例如在我的 Phone 中,您将不会遇到此问题。 Dropbox 本身就是问题所在。
我了解到您可以使用 Dropbox API 并查阅文件元数据来了解文件名的原始大小写,但我认为在您的情况下没有办法做到这一点。
如果 ios 目标高于 ios 14 然后尝试使用 .fileImporter 表示修饰符
.fileImporter(isPresented: $showDocumentPicker,
allowedContentTypes: [.audio],
allowsMultipleSelection: true)
{ result in
// processing results Result<[URL], Error>
}
我正在开发的 iOS 14 SwiftUI 应用程序有两种导入它播放的音频文件的方法:用户可以打开一个 UIDocumentPickerViewController 和 select 一个可以在他们的 phone 上访问的音频文件(例如,他们的 Dropbox 中的一个),或者他们可以通过 AirDrop 将音频文件传输到应用程序。
我是 运行 我 phone 上的应用程序,而不是模拟器上的应用程序。
我的 Dropbox 中有一个文件,其文件名显示为“09 The Chant of the Tuxedos.mp3”。当我打开我的应用程序的文件选择器时,文件名会在 Dropbox 中以这种大写形式显示。然而,当我 select 它时,当我的文档选择器协调器的 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 文件从我的计算机 AirDrop 到我的应用程序,则文件名大写会被保留。
在 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(或任何其他方式)选择一个音频文件来保留原始文件的大写字母吗?
如果您 运行 在其他地方的文件中使用相同的代码,例如在我的 Phone 中,您将不会遇到此问题。 Dropbox 本身就是问题所在。
我了解到您可以使用 Dropbox API 并查阅文件元数据来了解文件名的原始大小写,但我认为在您的情况下没有办法做到这一点。
如果 ios 目标高于 ios 14 然后尝试使用 .fileImporter 表示修饰符
.fileImporter(isPresented: $showDocumentPicker,
allowedContentTypes: [.audio],
allowsMultipleSelection: true)
{ result in
// processing results Result<[URL], Error>
}