如何使用 MagicalRecord (Core Data) 启动 iCloud 并 运行?

How to get iCloud with MagicalRecord (Core Data) up and running?

为了让 iCloud 支持我使用 MagicalRecord 框架管理的数据,我最近几天一直在苦苦挣扎。

我在 xCode 中完成了所有关于供应配置文件和所有设置的工作。在代码中而不是调用

[MagicalRecord setupAutoMigratingCoreDataStack];

我在打电话

[MagicalRecord setupCoreDataStackWithiCloudContainer:@"AppIDFromiTunesConnect.com.companyName.myAppName" localStoreNamed:@"whatever"];

我尝试通过在 iPhone 模拟器上触发 iCloud 同步来模拟同步。但似乎什么也没有发生。我在 developer.iCloud.com.

上看不到任何内容

问题:有人 iCloud with MagicalRecord up 和 运行 吗?您能解释一下如何完成吗?

您上面所做的是正确的,但有几件事需要检查。

  • 确保您的配置文件设置正确。
  • 检查您的个人资料字符串是否有任何拼写错误。
  • 确保您已经下载并安装了新的配置文件。
  • 检查您当地的商店名称是否存在拼写错误。

好的伙计们,我想我成功了。

UPDATE 最初它对我有用,但我有一些非常奇怪的效果,而且如果您从 iCloud 注销,无处不在的容器将被删除这一事实让我想到了替代解决方案。现在我使用 Ensembles 库并且对它非常满意。 更新结束

我刚刚对 2 年前编写的自己的测试应用进行了拉皮条,它没有 CoreData 也没有 iCloud,但它似乎运行良好。它在我的 iPhone 和 iPhone 模拟器中同步数据库。让我发疯的一件小事是我仍然没有在 https://developer.icloud.com 上看到任何东西..

现在我要为我的分布式应用程序做同样的事情。这正是我所做的:

  1. 所有这些东西的好处是您几乎不需要在开发人员门户上执行任何操作(例如创建和下载配置文件,甚至不需要创建 App ID)- XCode 6.3 .2 为您做这一切;当然,如果您知道顺序。所以首先,转到目标的设置 -> 功能,并启用 iCloud。 Xcode 完成添加授权文件、在开发者门户上创建 App ID 和创建 iCloud 容器的工作。取消选中 "Key-Value Storage" 并选中 "iCloud Documents".

  1. 我假设你正在使用 MagicalRecord 并且你设置你的 Core Data 堆栈如下:

[MagicalRecord setupAutoMigratingCoreDataStack];

在这种情况下,MagicalRecord 创建了一个本地存储,您可以通过调用 [MagicalRecord defaultStoreName] 获得该名称。您需要在 iCloud 设置调用中说明这一点。所以我现在在 AppDelegate.m 中的代码是:

NSString *defaultStoreName = [MagicalRecord defaultStoreName];
[MagicalRecord setupCoreDataStackWithiCloudContainer:@"Container ID from Developer Portal (as on image)"
                                      contentNameKey:@"DataStorage" // It seems like you can write whatever you want here
                                     localStoreNamed:defaultStoreName // Unless not specifically named earlier
                             cloudStorePathComponent:@"stuff"]; // Seems like you can write whatever stuff you want. 

这个方法对我有用。另一个更短的 iCloud 设置调用方法(没有 ContentNameKey)没有抛出异常,但没有正常工作。我想,您只需声明 ContentNameKey。

这里是您在 Developer Portal 上获取容器 ID 的地方。我知道,这似乎是一个非常详细的说明,但我希望我能清楚地知道上面函数中的 "iCloudContainer" 字符串实际上是 iCloudContainerID,应该从 Developer Portal 检索。

  1. 转到设备设置 -> iCloud -> iCloud Drive 并启用它。使用您的帐户登录 iCloud。 这对整个事情的运作至关重要。

  1. 现在至少尝试 运行 模拟器上的应用程序。如果您在日志中没有 "iCloud not enabled" 消息,那么您已经中途了。

  2. 注册负责所有 Core Data 操作的对象以监听 NotificationCenter 以下事件: NSPersistentStoreCoordinatorStoresWillChangeNotification NSPersistentStoreCoordinatorStoresDidChangeNotification NSPersistentStoreDidImportUbiquitousContentChangesNotification

像这样:

[[NSNotificationCenter defaultCenter] addObserver:self
           selector:@selector(storesWillChange:)
               name:NSPersistentStoreCoordinatorStoresWillChangeNotification
             object:nil];

并妥善处理变更。

艰巨的工作尚未完成,现在取决于您的项目,我无法单独给您任何建议。

对我来说,问题是:

  • 如何对远程存储中的更改做出反应
  • 如何合并不同的数据并避免重复
  • 如果 iCloud 容器为空,如何避免完全丢失数据

但我希望在 official Apple Manual to iCloud 中找到我所有问题的答案。

我很高兴为您避免了几天的头痛!如果此解决方案适用于您的项目,请发表评论!