4

我想从 Google 驱动器和 One Drive 云服务中选择文件用于我正在使用的目的UIDocumentPickerViewController

在此处输入图像描述

前任:

func didPressOneDriveChoose() {
    let importMenu = UIDocumentPickerViewController(documentTypes: [(kUTTypePDF as String), (kUTTypeJPEG as String), (kUTTypePNG as String)], in: .import)
    importMenu.delegate = self
    importMenu.modalPresentationStyle = .formSheet
    self.show(importMenu, sender: nil)
}

在委托方法上收到回调:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]){

    var arrFiles = [Dictionary<String, AnyObject>]()
    for url in urls {
        // returns local document directory URL
        // needs original GoogleDrive or OneDrive URL
    }
}

但我想知道有什么方法可以让用户选择哪个云服务,并且我想要指向该 URL 的原始 URL?目前,它在单击下载该文件后返回本地文档目录 URL。

4

2 回答 2

3

你这样初始化:

let importMenu = UIDocumentPickerViewController(documentTypes: [(kUTTypePDF as String), (kUTTypeJPEG as String), (kUTTypePNG as String)], in: .import)

如果您阅读有关此特定选择器模式的文档,.import它会指出:

URL 引用所选文档的副本。这些文件是临时文件。它们仅在您的应用程序终止之前保持可用。要保留永久副本,请将这些文件移动到沙箱内的永久位置。

.open似乎它更适合您的用例。

URL 引用选定的文档。提供的 URL 是安全范围的,指的是应用沙箱之外的文件。有关使用外部安全范围 URL 的更多信息,请参阅要求。

但是,由于您只是观察 url 来识别服务,而不是实际尝试手动访问这些文档,因此您不必担心违反任何要求。所以将UIDocumentPickerViewController初始化更改为:

let importMenu = UIDocumentPickerViewController(documentTypes: [(kUTTypePDF as String), (kUTTypeJPEG as String), (kUTTypePNG as String)], in: .open)

它应该工作!

于 2018-04-11T15:38:16.327 回答
1

出于隐私原因,您将无法知道云服务(除非您开始从 URL 推断它......坏主意)。但是,如果您使用open模式而不是import模式 ( in: .open),则可以从原始位置获取文件,而不是副本。警告,如果您使用该open模式,您将开始就地打开文档,因此您需要适当地使用文件协调。

于 2018-04-11T15:35:04.490 回答