如何使用MagicalRecord(核心数据)启动并运行iCloud?

bow*_*ann 14 xcode core-data ios icloud magicalrecord

我在最后几天都在苦苦挣扎,以便为我使用MagicalRecord框架管理的数据启用iCloud支持.

我做了关于配置文件的所有内容,以及xCode中的所有设置.在代码而不是调用

[MagicalRecord setupAutoMigratingCoreDataStack];
Run Code Online (Sandbox Code Playgroud)

我在打电话

[MagicalRecord setupCoreDataStackWithiCloudContainer:@"AppIDFromiTunesConnect.com.companyName.myAppName" localStoreNamed:@"whatever"];
Run Code Online (Sandbox Code Playgroud)

我尝试通过在iPhone模拟器上触发iCloud同步来模拟同步.但似乎没有任何事情发生.我在developer.iCloud.com上看不到任何内容.

问题:任何人都有使用MagicalRecord的iCloud启动并运行?你能解释一下如何完成它吗?

bow*_*ann 6

好的伙计们,我想我已经开始工作了.

更新最初它对我有用,但我有一些非常奇怪的效果,如果你从iCloud注销无处不在的容器被删除的事实让我考虑替代解决方案.现在我使用Ensembles库,我对此非常满意.结束更新

我只是拉了我自己2年前写的测试应用程序,它没有CoreData也没有iCloud,它似乎工作得很好.它在我的iPhone和iPhone模拟器上同步数据库.让我疯狂的一件小事是我在https://developer.icloud.com上看不到任何东西.

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

  1. 关于所有这些东西的好处是你几乎不必在Developer Portal上做任何事情(比如创建和下载配置文件,甚至不需要创建App ID) - XCode 6.3.2为你完成所有这些工作; 如果你知道订单,当然.首先,转到目标的设置 - >功能,然后启用iCloud.Xcode负责添加Entitlements文件,在开发人员门户上创建App ID并创建iCloud Container.取消选中"键值存储"并选中"iCloud Documents".

在XCode中启用iCloud

  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. 
Run Code Online (Sandbox Code Playgroud)

这种方法对我有用.另一个较短的iCloud设置调用方法(没有ContentNameKey)没有抛出异常,但没有正常工作.我想,你只需要说出ContentNameKey.

您可以在此处获取Developer Portal上的容器ID.我知道,这似乎是一个非常详细的说明,但我希望我很清楚,上面函数中的"iCloudContainer"字符串实际上是iCloudContainerID,应该从Developer Portal中检索. 货柜ID

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

设备上的iCloud设置

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

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

像这样:

[[NSNotificationCenter defaultCenter] addObserver:self
           selector:@selector(storesWillChange:)
               name:NSPersistentStoreCoordinatorStoresWillChangeNotification
             object:nil];
Run Code Online (Sandbox Code Playgroud)

并正确处理更改.

艰苦的工作仍有待完成,现在取决于你的项目,我不能单独给你任何建议.

对我来说,问题是:

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

但我希望在iCloud官方Apple手册中找到我的问题的所有答案.

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