在真实设备上选择 PDF 时 iOS 文档选择器崩溃

Posted

技术标签:

【中文标题】在真实设备上选择 PDF 时 iOS 文档选择器崩溃【英文标题】:iOS Document Picker crashes when picking a PDF on a real device 【发布时间】:2020-11-01 13:50:20 【问题描述】:

我尝试为我的 ios 应用创建一个文档选择器。

这是我的代码(我将 UIDocumentPickerViewController 包装在我的 SwiftUI 视图中,使用 UIViewControllerRepresentable):

import SwiftUI
import MobileCoreServices

struct DocumentPickerViewController: UIViewControllerRepresentable 
    var callback: (Data) -> ()

    func makeCoordinator() -> Coordinator 
        return Coordinator(documentController: self)
    

    func updateUIViewController(
        _ uiViewController: UIDocumentPickerViewController,
        context: UIViewControllerRepresentableContext<DocumentPickerViewController>) 
    

    func makeUIViewController(context: Context) -> UIDocumentPickerViewController 
        let controller = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .open)
        controller.delegate = context.coordinator
        return controller
    

    class Coordinator: NSObject, UIDocumentPickerDelegate 
        var documentController: DocumentPickerViewController

        init(documentController: DocumentPickerViewController) 
            self.documentController = documentController
        

        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) 
            guard let url = urls.first else  return 

            let fileManager = FileManager.default
            print(fileManager.fileExists(atPath: url.path))
            let data = NSData(contentsOfFile: url.path)
            let file = UploadFileData(fileName: "\(url)", fileType: .file, fileData: data!)
            let dataFile = file.fileData as Data
            
            documentController.callback(dataFile)
        
    


enum UploadFileType
    case photo
    case file


struct UploadFileData 
    var fileName: String
    var fileType: UploadFileType
    var fileData: NSData


var file: UploadFileData?

它可以在我的模拟器上运行,但是当我在真实设备上选择 PDF 时,我收到以下错误: 致命错误:在展开可选值时意外发现 nil:文件 MyApp/DocumentPickerViewController.swift,第 44 行

即换行:let dataFile = file.fileData as Data

【问题讨论】:

【参考方案1】:

存在的问题是您在定义文档选择器使用的文件传输操作类型时使用了错误的模式。 .open 用于打开位于应用沙箱之外的外部文件。您需要使用.import,它将创建一个临时文件,允许您加载其内容或将文件移动/复制到永久位置。如果它不能解决您的问题,请查看post,了解如何实现您的 DocumentPickerViewController 协调器

let controller = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .import)

【讨论】:

以上是关于在真实设备上选择 PDF 时 iOS 文档选择器崩溃的主要内容,如果未能解决你的问题,请参考以下文章

仅在 iOS 上选择 <input> 时键盘不显示

无法在 IOS 和 Android 移动设备上选择文件

Element UI - VueJS - 在 IOS 上选择输入双击错误

无法在 iOS 8 上选择联系人

在移动设备上选择文本时覆盖本机行为

在 Android 设备上选择后置摄像头 - jsartoolkit5