无法以编程方式访问iCloud Drive中的某些文件

时间:2019-07-31 15:04:37

标签: ios icloud icloud-drive

这可能是我的解决方法

我怀疑出现问题是因为我没有打开“ iCloud”功能,但是由于我拥有免费的开发者帐户,所以我不能这样做。

如果打开“ iCloud”功能是解决方案,是否还有一些说明此问题的文档

我只发现了documentation regarding "CloudKit",从未提及“ iCloud Drive”。

在此website上有一些指向其他文档的链接。


问题陈述

iCloud Drive中的文件夹结构:

  • “ TestApp”(具有iCloud Drive中应用名称的目录)
    • “测试”(目录)
      • “ testFile 1.txt”(使用UIDocumentBrowserViewController打开文档)
      • “ testFile 2.txt”(尝试以编程方式打开文档)

如果我使用UIDocumentBrowserViewControllerdocumentation)在目录中打开文档,则可以毫无问题地调用document.open(...)documentUIDocument的子类)。但是,如果我要以编程方式访问文件夹中的另一个文件,则会出现错误:

  

Error Domain = NSCocoaErrorDomain代码= 257“由于您无权查看文件“ testFile 2.txt”,因此无法打开该文件。” UserInfo = {NSFilePath = / private / var / mobile / Library / Mobile Documents / com〜apple〜CloudDocs / TestApp / test / testFile 2.txt,NSUnderlyingError = 0x2829d20a0 {Error Domain = NSPOSIXErrorDomain代码= 1“不允许操作”}}

我如何尝试以编程方式访问“ testFile 2.txt”

当用户打开“ testFile 1.txt”时,我得到了它的网址,即:

"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”“不存在”。

1 个答案:

答案 0 :(得分:0)

考虑一个类比:

您是某人家中的客人。你要水。他们从冰箱里拿出一瓶给您。

这是否意味着他们已准许您去冰箱拿啤酒或一瓶酒?否。这是否意味着可以搜索冰箱的物品以查看其拥有的物品?否。您可以明确要求啤酒吗?是。他们可以说“不”吗?也是。

类似地,您的应用程序是用户设备上的访客。它在沙箱中运行。它需要请求访问沙箱外部资源的权限。

对于文件访问,它需要其想要访问的文件的特定权限。它不能只是创建文件路径并访问文件。用户需要专门授予访问文件的权限。

在这种情况下,通过UIDocumentBrowserViewController授予权限。您的应用未获得对testFile 2.txt的访问权限,因此iOS就像该文件不存在一样。如果要访问该文件,则必须明确询问。

应用程序无法访问用户文件的完整内容。