首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iCloud:我能忽略那些禁用iCloud的人吗?

iCloud:我能忽略那些禁用iCloud的人吗?
EN

Stack Overflow用户
提问于 2011-10-17 19:29:28
回答 3查看 3.7K关注 0票数 8

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

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

代码语言:javascript
复制
- (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文件。

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

所以根本不需要在我的本地文档文件夹中存储第三份副本,对吗?还是因为我忽略了一些原因,这是必要的?换句话说,如果我向用户提供iCloud,我应该使用什么本地文档文件夹?(我能忽略那些不愿注册iCloud的人吗?)

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

代码语言:javascript
复制
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-21 22:13:52

没有理由既在本地存储也在iCloud中存储文档。但是,您应该给用户关闭iCloud存储的选项。在关闭iCloud存储后,您应该只在本地存储中查找文件(就像在前置iOS5 5应用程序中那样)。最好的方法是隔离代码中需要知道文档存储位置的部分,并让它测试iCloud是否可用并启用,并让该代码返回应该存储文档的URL。

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

if ([UIDocument class] == nil)

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

票数 2
EN

Stack Overflow用户

发布于 2011-10-24 08:42:22

也许我有点慢,通过第4次或第5次重新阅读文档,我发现了这一点,这意味着您应该始终在沙箱中创建您的文件,然后将它们移动到云中。因此,在某种程度上,苹果建议在任何时候都有3个版本的相同文件:

应用程序使用与本地文件和目录相同的技术来管理iCloud中的文件和目录。iCloud中的文件和目录仍然只是文件和目录。您可以打开它们、创建它们、移动它们、复制它们、从它们中读取和写入它们、删除它们或执行您可能想要执行的任何其他操作。本地文件和目录与iCloud文件和目录之间唯一的区别是用于访问它们的URL。iCloud文件和目录的URL不是相对于应用程序的沙箱,而是相对于相应的iCloud容器目录。 若要将文件或目录移动到iCloud: 在应用程序沙箱中本地创建文件或目录。在使用时,文件或目录必须由文件演示程序(如UIDocument对象)管理。 使用URLForUbiquityContainerIdentifier:方法检索要在其中存储该项的iCloud容器目录的URL。使用容器目录URL构建一个新的URL,该URL指定项目在iCloud中的位置。调用setUbiquitous:itemAtURL:destinationURL: NSFileManager的错误:方法将项移动到iCloud。不要从应用程序的主线程调用此方法;这样做可能会阻塞您的主线程很长一段时间,或者会导致与应用程序自己的文件显示者之间的死锁。当您将文件或目录移动到iCloud时,系统会将该项目从应用程序沙箱中复制到私有本地目录中,以便由iCloud守护进程监视。即使这个文件已经不在你的沙箱里了,你的应用程序仍然可以完全访问它。虽然该文件的副本仍然是当前设备的本地副本,但该文件也被发送到iCloud,以便将其分发给其他设备。iCloud守护进程处理确保本地副本相同的所有工作。因此,从应用程序的角度来看,该文件只是在iCloud中。 必须使用文件协调器对象对iCloud中的文件或目录进行所有更改。这些更改包括移动、删除、复制或重命名项目。文件协调器确保iCloud守护进程不会同时更改文件或目录,并确保将您所做的更改通知其他相关方。

看这里。

票数 3
EN

Stack Overflow用户

发布于 2011-10-17 19:35:38

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7798555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档