为了让 iCloud 支持我使用 MagicalRecord 框架管理的数据,我最近几天一直在努力。
我做了所有关于配置文件的事情,以及 xCode 中的所有设置。在代码中而不是调用
[MagicalRecord setupAutoMigratingCoreDataStack];
我在打电话
[MagicalRecord setupCoreDataStackWithiCloudContainer:@"AppIDFromiTunesConnect.com.companyName.myAppName" localStoreNamed:@"whatever"];
我尝试通过在 iPhone 模拟器上触发 iCloud 同步来模拟同步。但似乎什么也没有发生。我在 developer.iCloud.com 上看不到任何内容.
问题:有人安装并运行了 iCloud with MagicalRecord 吗?您能解释一下如何完成吗?
最佳答案
好的,伙计们,我想我成功了。
更新 最初它对我有用,但我有一些非常奇怪的效果,而且如果您从 iCloud 注销,无处不在的容器将被删除这一事实让我想到了替代解决方案。现在我使用 Ensembles 库并且对它非常满意。 结束更新
我刚刚对自己 2 年前编写的测试应用进行了拉皮条,它既没有 CoreData 也没有 iCloud,而且看起来运行良好。它在我的 iPhone 和 iPhone 模拟器之间同步数据库。让我发疯的一件小事是我仍然没有在 https://developer.icloud.com 上看到任何东西。 ..
现在我要为我的分布式应用程序做同样的事情。这正是我所做的:
- 所有这些东西的好处是您几乎不需要在开发人员门户上执行任何操作(例如创建和下载配置文件,甚至不需要创建 App ID)- XCode 6.3.2 可以完成所有这些工作你;当然,如果您知道顺序。所以首先,转到目标的设置 -> 功能,然后启用 iCloud。 Xcode 负责添加授权文件、在开发人员门户上创建 App ID 以及创建 iCloud 容器。取消选中“键值存储”并选中“iCloud 文档”。
- 我假设您使用的是 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,应该从开发人员门户中检索。
- 转到设备设置 -> iCloud -> iCloud Drive 并启用它。使用您的帐户登录 iCloud。 这对整个事情的运作至关重要。
现在尝试至少在模拟器上运行该应用程序。如果您在日志中没有收到“iCloud 未启用”消息,则说明您已经完成了一半。
注册负责所有 Core Data 操作的对象,以监听以下事件的
NotificationCenter
:NSPersistentStoreCoordinatorStoresWillChangeNotification
NSPersistentStoreCoordinatorStoresDidChangeNotification
NSPersistentStoreDidImportUbiquitousContentChangesNotification
像这样:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(storesWillChange:)
name:NSPersistentStoreCoordinatorStoresWillChangeNotification
object:nil];
并妥善处理变更。
艰巨的工作尚未完成,现在取决于您的项目,我无法单独给您任何建议。
对我来说,问题是:
- 如何对远程存储中的变化使用react
- 如何合并不同的数据并避免重复
- 如果 iCloud 容器为空,如何避免完全丢失数据
但我希望在 official Apple Manual to iCloud 中找到我所有问题的答案.
我很高兴为您避免了几天的头痛!如果此解决方案适用于您的项目,请发表评论!
关于ios - 如何启动并运行带有 MagicalRecord(核心数据)的 iCloud?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29509579/