【问题标题】:How can I copy a file from DocumentPicker to my own application?如何将文件从 DocumentPicker 复制到我自己的应用程序?
【发布时间】:2022-07-11 20:39:13
【问题描述】:

我要求用户使用 DocumentPicker 在 iPhone 的“文件夹”应用程序中选择图像或文件。如何将此选定的文件或图像传输到我自己的应用程序?

表格:

.sheet(isPresented: $isOpenDocumentPicker, onDismiss: {
            self.isOpenDocumentPicker = false
        }, content: {
            DocumentPicker(fileContent: $fileContent)
        })

文档选择器:

struct DocumentPicker: UIViewControllerRepresentable {
    
    @Binding var fileContent: String
    
    func makeCoordinator() -> DocumentPickerCoordinator {
        return DocumentPickerCoordinator(fileContent: $fileContent)
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<DocumentPicker>) -> UIDocumentPickerViewController {
        let controller: UIDocumentPickerViewController
        controller = UIDocumentPickerViewController(forOpeningContentTypes: [.text, .pdf, .folder, .jpeg, .png, .gif, .exe, .data], asCopy: true)
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<DocumentPicker>) {
        
    }
}

class DocumentPickerCoordinator: NSObject, UIDocumentPickerDelegate, UINavigationControllerDelegate {
    
    @Binding var fileContent: String
    
    init(fileContent: Binding<String>) {
        _fileContent = fileContent
    }
    
    
    
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        let fileURL = urls[0]
        do {
            fileContent = try String(contentsOf: fileURL, encoding: .utf8)
        } catch let error {
            print("error: \(error)")
        }
    }
}

【问题讨论】:

  • 你为什么说“到我自己的应用程序”?内包? - 不。在沙箱内 - 只需使用接收到 URL 的 FileManager 进行复制。

标签: swiftui uidocumentpickerviewcontroller


【解决方案1】:

根据Apples documentation,您必须在访问文件内容之前调用startAccessingSecurityScopedResource()

在您的情况下,我将更新 documentPicker() 函数如下:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    let fileURL = urls[0]

    guard fileURL.startAccessingSecurityScopedResource() else {
        // Handle denied access
        return
    }
    defer { fileURL.stopAccessingSecurityScopedResource() }

    do {
        fileContent = try String(contentsOf: fileURL, encoding: .utf8)
    } catch let error {
        print("error: \(error)")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多