我的应用程序首次启动时需要加载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,因为这里提到的内容:How to access files in iCloud Drive from within my iOS app?
当用户选择应用程序沙箱外的目标时,文档选择器会调用委托的documentPicker:didPickDocumentAtURL:方法 . 系统会将文档副本保存到指定目标 . 文档选择器提供副本的URL以指示成功;但是,您的应用无权访问此网址引用的文件 .
所以我的问题是,如果它是一个iCloud文件,我如何加载这个最后打开的文件? documentBrowser可以访问它,但是这是因为用户在屏幕上选择了文件并且出于保护原因我无法在代码中模拟这个文件?预先感谢您的任何帮助!
1 回答
文档选择器用于将文件复制到应用程序的沙箱和另一个沙箱中 .
如果文件存储在通用iCloud Drive而不是应用程序的私有iCloud容器中,则可以通过Ubiquity Url访问它们 - https://developer.apple.com/documentation/foundation/filemanager/1411653-url
您可以通过类似于
url(for:.documentDirectory
的方式将您的相对路径追加到ubiquity网址