【问题标题】:iCloud: can I ignore those who disable iCloud?iCloud:我可以忽略那些禁用 iCloud 的人吗?
【发布时间】:2011-12-09 13:23:58
【问题描述】:

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

据我所知,docs 没有给出答案。假设我有一个处理不同 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];

【问题讨论】:

  • 物有所值;如果用户启用了备份,iCloud 将backup Document 目录。
  • 另一个 FWIW:我不会忽略未启用 iCloud 的用户。大多数 Apple 开发文档都谈到能够在用户启用/禁用您的应用时将数据迁移到 iCloud。
  • @quixoto:我明白你的意思,但是你不觉得让同一件事的三个副本漂浮在你身边吗?另外,迁移数据的最佳方法是什么?看来我需要同时做两件事:关心 iCloud 并保存到我的目录。我什么时候做这个?在将数据推送到云时,我是否在 UIDocument 中实现此功能?所有这一切都让人感觉如此复杂,因为我需要担心两组数据,我需要一直保持同步。为什么用户不启用 iCloud?
  • 我绝对不会忽视非 iCloud 用户。如果用户只有一台设备,则 iCloud 文档存储没有任何好处(在 iCloud 存储中存储文档仅对保持多台设备同步有用)。
  • @Ron 好吧,即使您只有一台设备,您也可以使用备份功能,即您希望您的文档(尤其是包含重要信息的小 txt 文件)始终备份到云。

标签: iphone ios cocoa-touch ipad icloud


【解决方案1】:

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

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

将文件或目录移动到 iCloud:

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

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

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

See here.

【讨论】:

    【解决方案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 对象。

    【讨论】:

    • 谢谢。你有任何示例代码吗?我最大的问题是何时使用 UIDocument 以及是否应该将其与写入沙箱的旧方法结合起来。因此,例如,我检查云中或本地文档目录中是否有文档(如果云已关闭)。如果我想写怎么办?是否首先调用 UIDocument 程序,然后将旧程序写入我的本地目录(如果云关闭)?我(作为初学者)只是觉得这完全弄乱了我的代码,我只想支持 iOS 5 设备,为什么要为旧方式烦恼?至于只有一台设备的用户,见上文。
    • 详情见上文。
    • 通常,您永远不会检查您知道在某个 iOS 版本中可用的课程,而是检查功能。 NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; if (ubiq) { NSLog(@"iCloud access at %@", ubiq); // TODO: Load document... } else { NSLog(@"No iCloud access"); }(代码来自 (stackoverflow.com/questions/8957036/…)
    【解决方案3】:

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

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

    【讨论】:

    • 所以换句话说,如果我想构建一个同步你创建的东西的应用程序,你只将东西存储在云中,对吗?不需要文档目录了吗?
    • 如果 iCloud 在幕后进行缓存(我相信确实如此),那么您是正确的。
    • 谢谢,但是完全放弃好的旧文档目录感觉很奇怪。因此,如果人们不使用 iCloud,他们将无法使用该应用程序……我想这很好。我只是有点害怕把所有东西都放在云端......
    • 这不能回答 OP 的问题。他问的是基于 iCloud 的完整文档管理,而不是备份。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2020-01-01
    • 2023-03-08
    • 2011-12-28
    • 2013-07-15
    • 2011-09-29
    相关资源
    最近更新 更多