3 回答
TA贡献1820条经验 获得超2个赞
我只是重新阅读了文档,看来我的一般方法是错误的。我应该首先在沙箱中创建文件,然后将其移动到云中。换句话说,Apple似乎建议我始终保持同一个文件的三个版本:一个位于我的应用程序目录中,一个位于设备的iCloud demon目录中(如果脱机也可以访问),另一个云端:
应用程序使用与本地文件和目录相同的技术来管理iCloud中的文件和目录。iCloud中的文件和目录仍然只是文件和目录。您可以打开它们,创建它们,移动它们,复制它们,对其进行读写,删除它们或您可能想要执行的任何其他操作。本地文件和目录与iCloud文件和目录之间的唯一区别是用于访问它们的URL。iCloud文件和目录的URL相对于相应的iCloud容器目录,而不是相对于应用程序沙箱的URL。
要将文件或目录移动到iCloud:
在应用程序沙箱中本地创建文件或目录。在使用时,文件或目录必须由文件演示者(例如UIDocument对象)管理。
使用URLForUbiquityContainerIdentifier:方法检索要在其中存储该项目的iCloud容器目录的URL。使用容器目录URL构建新的URL,该URL指定该项目在iCloud中的位置。调用NSFileManager的setUbiquitous:itemAtURL:destinationURL:error:方法将项目移动到iCloud。永远不要从应用程序的主线程调用此方法;这样做可能会长时间阻塞主线程,或者导致应用程序自己的文件提交者之一陷入僵局。当您将文件或目录移动到iCloud时,系统会将该项从应用程序沙箱中复制到私有本地目录中,以便可以由iCloud守护程序进行监视。即使该文件不再位于沙箱中,您的应用仍然可以完全访问它。尽管该文件的副本仍保留在当前设备的本地,但该文件也将发送到iCloud,以便可以将其分发到其他设备。iCloud守护程序处理确保本地副本相同的所有工作。因此,从您的应用程序角度来看,文件仅位于iCloud中。
您必须使用文件协调器对象对iCloud中的文件或目录进行所有更改。这些更改包括移动,删除,复制或重命名项目。文件协调器确保iCloud守护程序不会同时更改文件或目录,并确保将您所做的更改通知其他相关方。
但是,如果您深入研究有关setUbiquitous的文档,则会发现:
使用此方法将文件从当前位置移动到iCloud。对于位于应用程序沙箱中的文件,这涉及从沙箱目录中物理删除文件。(系统扩展了应用程序的沙箱特权,使其可以访问移动到iCloud的文件。)您还可以使用此方法将文件移出iCloud并移回本地目录。
因此,这似乎意味着文件/目录将从本地沙箱中删除,并移至云中。
TA贡献1863条经验 获得超2个赞
我一直在使用您的示例,我喜欢它来帮助我掌握iCloud的基础知识。现在,我正在为您自己的应用程序解决您的问题,该应用程序必须使用本地存储的内容来支持该应用程序的现有用户,就我所知,这些内容可能会或可能不会使用iCloud创建这些情况:
情况:
新的用户
有icloud-在icloud中创建文档
没有icloud-在本地创建文档
现有用户
刚刚删除-将以前的icloud文档迁移到本地
不只是删除-将文档打开/保存到本地
刚刚添加-将本地文档迁移到icloud
不只是添加-将文档打开/保存到icloud
有icloud
没有icloud
如果有人删除了iCloud,则对普遍存在的URL的调用不会返回nil吗?如果是这种情况,我该如何将文档迁移回本地存储?我现在将创建一个用户偏好设置,但似乎有些解决方法。
我觉得我这里缺少明显的东西,所以如果有人可以看到它,请发出提示。
- 3 回答
- 0 关注
- 691 浏览
添加回答
举报