iCloud:我可以忽略那些禁用iCloud的人吗?

n.e*_*ind 8 iphone cocoa-touch ipad ios icloud

我对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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

Ron*_*Ron 2

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

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

if ([UIDocument class] == nil)

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