我正在为我的应用程序开发一项功能,用户可以从设备中的共享存储(Drive、onDrive、Dropbox 等)上传 PDF 我正在使用 Kotlin Multiplatform 2.0.20
这是我用来上传 iOS 版 PDF 的代码,它适用于从 iCloud 选择的文件、在设备和 Dropbox 中本地下载的文件,但不适用于 Google Drive
和
OneDrive
val documentPickerController = UIDocumentPickerViewController(
forOpeningContentTypes = listOf(UTTypePDF)
)
documentPickerController.allowsMultipleSelection = false
val documentDelegate = remember {
object : NSObject(), UIDocumentPickerDelegateProtocol {
override fun documentPicker(
controller: UIDocumentPickerViewController,
didPickDocumentAtURL: NSURL
) {
val accessing =
didPickDocumentAtURL.startAccessingSecurityScopedResource()
val data = try {
NSData.dataWithContentsOfURL(didPickDocumentAtURL)
} catch (e: Error) {
e.printStackTrace()
null
}
if (accessing == true) {
didPickDocumentAtURL.stopAccessingSecurityScopedResource()
}
controller.dismissViewControllerAnimated(true, null)
}
}
}
调试时我发现问题在这一行:NSData.dataWithContentsOfURL(didPickDocumentAtURL)
它返回
null
没有抛出异常,甚至将其放入 try/catch
块中也无助于理解 null 值背后的错误。我没有 ObjectiveC 或 Swift 的专业知识,所以我正在寻求您的帮助:)
我发现这完全是一个类似的问题:
https://www.hackingwithswift.com/forums/swiftui/error-domain-nsposixerrordomain-code-2-no-such-file-or-directory-when-using-fileimporter -然后阅读内容/20397
除了他们使用 SwiftUI,但我不是,所以我想知道如何在我的情况下修复它。如果有人遇到类似问题并可以分享他/她的想法,我很感激:)
谢谢!
注意:我不是 kotlin 专家
在快速方面,我们正在这样做。
if fileURL.startAccessingSecurityScopedResource() {
if let data = try? Data(contentsOf: fileURL) {
//USE DATA HERE
}
fileURL.stopAccessingSecurityScopedResource()
}