8

我对 iCloud 的想法有点挣扎,并在这里发布了一个更普遍的问题。我最大的问题是决定是否应该停止将用户的数据放在应用程序沙箱中的旧文档文件夹中。为了说明我的问题:

在此处输入图像描述

据我所知,文档没有给出答案。假设我有一个处理不同 txt 文件的应用程序。启动应用程序后,我只需检查云中是否有任何 txt 文件,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"AppDelegate: app did finish launching");
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    // (1) iCloud: init

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    if (ubiq) {
        NSLog(@"User has iCloud enabled! Let's get the txt files from the cloud.");
        [self loadDocument];
    } else {
        NSLog(@"User doesn't have iCloud enabled. App is thus worthless.");
    }


    return YES;
}

然后我有一种方法可以检查云中是否有任何 txt 文件,如果有,请加载它们。如果没有,我只是在云中创建新的 txt 文件。

这意味着该应用程序不会在文档文件夹中存储任何数据。据我了解,一切都在我设备的本地 iCloud 存储中(如果用户离线,也可以访问)或在云中。所以文本文件存在于两个地方:我的设备和云端。

所以根本不需要在我的本地文档文件夹中存储第三个副本,对吧?还是出于某种我忽略的原因,这是必不可少的?换句话说,如果我向我的用户提供 iCloud,我应该使用本地文档文件夹做什么?(我可以简单地忽略那些不会注册 iCloud 的人吗?)


编辑:为了澄清,当我谈论应用程序沙箱中的标准文档文件夹时,我的意思是这个:

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
4

3 回答 3

3

也许我有点慢,通过第四次或第五次重新阅读文档,我遇到了这个问题,这表明您应该始终在沙箱中创建文件,然后将它们移动到云中。因此,在某种程度上,Apple 建议始终拥有同一文件的 3 个版本:

应用程序使用与管理本地文件和目录相同的技术来管理 iCloud 中的文件和目录。iCloud 中的文件和目录仍然只是文件和目录。您可以打开它们、创建它们、移动它们、复制它们、从中读取和写入、删除它们或您可能想要执行的任何其他操作。本地文件和目录与 iCloud 文件和目录之间的唯一区别是您用来访问它们的 URL。iCloud 文件和目录的 URL 不是相对于您的应用程序的沙箱的 URL,而是相对于相应的 iCloud 容器目录。

要将文件或目录移动到 iCloud:

在您的应用沙箱中本地创建文件或目录。在使用时,文件或目录必须由文件呈现器管理,例如 UIDocument 对象。

使用 URLForUbiquityContainerIdentifier: 方法检索要在其中存储项目的 iCloud 容器目录的 URL。使用容器目录 URL 构建一个新 URL,指定项目在 iCloud 中的位置。调用 NSFileManager 的 setUbiquitous:itemAtURL:destinationURL:error: 方法将项目移动到 iCloud。永远不要从你的应用程序的主线程调用这个方法;这样做可能会长时间阻塞您的主线程或导致与您的应用程序自己的文件呈现器之一发生死锁。当您将文件或目录移动到 iCloud 时,系统会将该项目从您的应用程序沙箱中复制到私有本地目录中,以便 iCloud 守护程序对其进行监视。即使该文件不再在您的沙箱中,您的应用程序仍然可以完全访问它。尽管该文件的副本保留在当前设备的本地,但该文件也会发送到 iCloud,以便可以分发到其他设备。iCloud 守护进程处理所有确保本地副本相同的工作。因此,从您的应用程序的角度来看,该文件只是在 iCloud 中。

您对 iCloud 中的文件或目录所做的所有更改都必须使用文件协调器对象进行。这些更改包括移动、删除、复制或重命名项目。文件协调器确保 iCloud 守护进程不会同时更改文件或目录,并确保将您所做的更改通知其他相关方。

看这里。

于 2011-10-24T08:42:22.230 回答
2

没有理由将文档同时存储在本地存储和 iCloud 中。但是,您应该为用户提供关闭 iCloud 存储的选项。关闭 iCloud 存储后,您应该只在本地存储中查找文件(与 iOS5 之前的应用程序一样)。最好的办法是尝试隔离需要知道文档存储位置的代码部分,并让它测试 iCloud 是否可用和启用,并让那段代码返回应该存储文档的 URL。

更新: 如果你想区分 iOS5 和 iOS4,你只需要测试 iOS5 的特性是否存在。有几种方法可以做到这一点。一种方法是检查:

if ([UIDocument class] == nil)

在 iOS4 上这将是真的,而在 iOS5 上这将是假的。我不知道你的文件有什么样的数据结构,但你可以做的一件事是围绕 UIDocument 创建一个包装器。在这个包装类中,您可以拥有 UIDocument 结构的实例变量以及 IOS4 中需要的字段(例如文件的路径)。当你实例化你的类时,测试是否启用了 iCloud 以及 UIDocument 是否可用,如果可用,使用它并设置字段。否则,设置其他字段并将 UIDocument 字段保留为 nil。当您需要对“文件”进行操作时,请测试 UIDocument 字段是否为 nil,以及是否以“旧”方式进行操作。否则,只需将请求传递给 UIDocument 对象。

于 2011-10-21T22:13:52.623 回答
1

请记住,如果用户启用了到 iCloud 的设备备份,文档目录无论如何都会被备份。

这实际上取决于您是否计划使用 iCloud 作为应用程序/平台之间的同步工具。如果你不是,那么使用 iCloud 来存储你的文档真的没有意义。

于 2011-10-17T19:35:38.217 回答