这可能是我的解决方案
我怀疑我的问题出在没有打开 "iCloud" 功能上,但由于我只有一个免费的开发者账户,所以无法这样做。
如果打开 "iCloud" 功能是解决方案,是否还有一些说明文件可以说明这一点?
我只发现了关于 "CloudKit" 的文档,但从来没有提到 "iCloud Drive"。
在这个网站上有一些链接到其他文档的链接。
问题陈述
iCloud Drive 中的文件夹结构:
- "TestApp"(iCloud Drive 中应用程序名称的目录)
- "test"(目录)
- "testFile 1.txt"(使用
UIDocumentBrowserViewController
打开的文档) - "testFile 2.txt"(尝试通过编程方式打开文档)
- "testFile 1.txt"(使用
- "test"(目录)
如果我使用 UIDocumentBrowserViewController
(文档)打开目录中的文档,我可以毫无问题地调用 document.open(...)
(document
是 UIDocument
子类)。然而,如果我想以编程方式访问文件夹中的其他文件,则会出现错误:
Error Domain=NSCocoaErrorDomain Code=257 "The file “testFile 2.txt” couldn’t be opened because you don’t have permission to view it." UserInfo={NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/TestApp/test/testFile 2.txt, NSUnderlyingError=0x2829d20a0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
我如何尝试编程访问 "testFile 2.txt"
当用户打开 "testFile 1.txt" 时,我会获取它的 URL,即:
"file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/TestApp/test/testFile%201.txt"
现在我正在使用以下代码尝试访问“testFile 2.txt”(请参见内联注释):
// I get this url from the delegate method `UIDocumentBrowserViewControllerDelegate.documentBrowser(_:didPickDocumentsAt:)`
let file1URL = // ...
let file2URL = file1URL
.deletingLastPathComponent()
.appendingPathComponent("testFile 2")
.appendingPathExtension("txt")
let success = file2URL.startAccessingSecurityScopedResource() // returns `false`
TestDocument(fileURL: file2URL).open{ success in
print(success) // prints `false` and see ERROR above
}
// checking existence
let fm = FileManager.default
fm.isUbiquitousItem(at: file1URL) // returns `true`
fm.fileExists(atPath: file1URL.path) // returns `true`
fm.isUbiquitousItem(at: file2URL) // returns `false`
fm.fileExists(atPath: file2URL.path) // returns `false`
正如您所看到的,对于文件管理器来说,“testFile 2.txt”“不存在”。
startAccessingSecurityScopedResource
来行使该权限。 - Paulw11