如何让MagicalRecord(Core Data)启动并运行iCloud?
为了让iCloud支持我用MagicalRecord框架管理的数据,我一直在挣扎着所有最后的日子。如何让MagicalRecord(Core Data)启动并运行iCloud?
我做了关于配置文件的所有内容,以及xCode中的所有设置。在代码,而不是调用
[MagicalRecord setupAutoMigratingCoreDataStack];
我打电话
[MagicalRecord setupCoreDataStackWithiCloudContainer:@"AppIDFromiTunesConnect.com.companyName.myAppName" localStoreNamed:@"whatever"];
我尝试在iPhone模拟器触发的iCloud同步模拟同步。但似乎没有发生。我在developer.iCloud.com上看不到任何东西。
问题:任何人有iCloud与MagicalRecord启动和运行?你能解释一下如何完成它吗?
好吧,我认为我有工作。
UPDATE最初它适用于我,但我有一些非常奇怪的效果,事实是,如果你从iCloud注销无处不在的容器被删除,让我想到替代解决方案。现在我使用Ensembles库,对它大多非常满意。 END UPDATE
我刚刚推出了我自己的测试应用程序,我写了2年前,没有CoreData和iCloud,它似乎工作很好。它通过我的iPhone和iPhone模拟器同步数据库。导致我坚果的一件小事是,我仍然没有看到任何东西https://developer.icloud.com ..
现在我将为我的分布式应用程序做同样的事情。这正是我所做的:
- 所有这些东西的好处是,你几乎不用做什么的开发者门户网站(如创建和下载的provisioning profile,甚至创建应用程序ID是没有必要的) - XCode 6.3.2为你做了这一切;如果你知道订单,当然。首先,转到目标的设置 - >功能,然后启用iCloud。 Xcode执行添加Entitlements文件,在开发者门户创建App ID并创建iCloud容器的工作。取消选中“Key-Value Storage”并选中“iCloud Documents”。
- 我假定您使用MagicalRecord和您设置您的核心数据堆栈如下:
- 转到设备设置 - >的iCloud - >的iCloud驱动并启用它。用您的帐户登录到iCloud。 这对整个工作来说至关重要。
现在尝试至少运行在模拟器上的应用程序。如果日志中没有“iCloud未启用”消息,则表明您处于中途。
注册,负责所有的核心数据行动听
NotificationCenter
对以下事件的对象:NSPersistentStoreCoordinatorStoresWillChangeNotification
NSPersistentStoreCoordinatorStoresDidChangeNotification
NSPersistentStoreDidImportUbiquitousContentChangesNotification
[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中检索。
这样的:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storesWillChange:)
name:NSPersistentStoreCoordinatorStoresWillChangeNotification
object:nil];
和处理更改正确。
艰难的工作还没有完成,现在取决于你的项目,我不能单独给你任何建议。
对于我的问题是:
- 如何在远程存储上的变化作出反应
- 如何合并不同的数据,避免重复
- 如何避免数据完全丢失,如果iCloud的容器是空的
但我希望能在official Apple Manual to iCloud找到我的问题的所有答案。
我很高兴为您避免了几天的头痛!如果此解决方案适用于您的项目,请写评论!
开始=> 开始=> 开始=>
上面所做的是正确的,但需要检查一些事项。
- 确保您的供应配置文件设置正确。
- 检查您的配置文件字符串是否有拼写错误。
- 确保您已下载并安装新的供应配置文件。
- 检查您的本地商店名称是否存在拼写错误。
嗨Beau Young,谢谢你的回答,我将在稍后测试它。你有它运作良好吗? –
然后我确实把它拉出来,并决定直接使用核心数据。很快我会重写并转移到这个https://realm.io –
感谢@Beau Young提出realm.io,听起来像一个伟大的图书馆,完全免费。但是,我没有发现任何地方的同步功能,这将是这个跨平台数据库的杀手锏。 –
您是否尝试在iPhone模拟器(在设置菜单中)登录到您的iCloud帐户? – ninjaproger
是的,当然:) –
我有一堆代码告诉我在控制台中是否启用iCloud。因此,如果iCloud在MagicalRecord框架之外未正确设置,我会收到错误消息。现在我没有错误,因此一切都应该工作,但它不是 –