1

当我的应用程序首次启动时,我需要加载一个 iCloud 文件。我希望应用程序显示从应用程序关闭时最后打开的文件,因此如果最后打开的文件是 iCloud 文件,这就是我遇到问题的地方。

首先让我声明,如果最后打开的文件在我的文档目录中而不是在 iCloud 中,那么我可以毫无问题地打开它。我不能只存储完整的 url 路径,因为我的应用程序的沙箱目录可以在重新打开应用程序时更改,所以我将最后打开的文件相对于最后打开的文件的文档目录的路径附加到我的 documentDirectory 路径在运行时通过这样做:

var myfolder: URL? {
        get {
            do {
                let docsurl = try fileManager.url(for:.documentDirectory,
                                         in: .userDomainMask, appropriateFor: nil, create: false)
                return docsurl
            } catch {
                return nil
            }
        }
    }

然后这个

if let lastOpenedFile = UserDefaults.standard.string(forKey: "lastOpenedFile") {
        let lastOpenedFileURL = myfolder!.appendingPathComponent(lastOpenedFile)
        print(lastOpenedFileURL.path)
        if (FileManager.default.fileExists(atPath: lastOpenedFileURL.path)) {
                documentBrowserViewController.presentDocument(at: lastOpenedFileURL)
        }
}

(如果这是一种不好的做法,请告诉我!)

现在回到主要问题。对于 iCloud 文件,保存 url 是一个问题,但问题不是沙盒目录已更改,而是因为此处提到的内容,我无权访问该 url:如何访问 iCloud Drive 中的文件从我的 iOS 应用程序中?它说

当用户选择应用程序沙箱之外的目的地时,文档选择器会调用委托的 documentPicker:didPickDocumentAtURL: 方法。系统将您的文档副本保存到指定的目的地。文档选择器提供副本的 URL 以指示成功;但是,您的应用无权访问此 URL 引用的文件。

所以我的问题是,如果它是 iCloud 文件,我如何加载最后打开的文件?documentBrowser 可以访问它,但这是因为用户选择了屏幕上的文件,并且出于保护原因我无法在代码中模拟它吗?预先感谢您的任何帮助!

4

1 回答 1

1

文档选择器用于将文件复制到/从应用程序的沙箱和另一个沙箱中复制出来。

如果文件存储在通用 iCloud Drive 而不是应用程序的私有 iCloud 容器中,您可以通过 Ubiquity Url 访问它们 - https://developer.apple.com/documentation/foundation/filemanager/1411653-url

您可以通过类似于以下方式将您的相对路径附加到普遍性 urlurl(for:.documentDirectory

于 2018-10-20T05:51:54.707 回答