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

时间:2015-04-08 08:27:57

标签: ios xcode core-data icloud magicalrecord

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

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

[MagicalRecord setupAutoMigratingCoreDataStack];

我正在打电话

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

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

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

2 个答案:

答案 0 :(得分:6)

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

UPDATE 最初它对我有用,但我有一些非常奇怪的效果,如果你从iCloud注销无处不在的容器被删除,这让我想到了另类解决方案。现在我使用Ensembles库,我对此非常满意。 END UPDATE

我只是拉扯了我自己在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"。
  2. Enabling iCloud in XCode

    1. 我假设您正在使用MagicalRecord,并按照以下方式设置Core Data堆栈:
    2. [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中检索。 Container ID

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

        1. 现在尝试至少在模拟器上运行应用程序。如果您没有" iCloud未启用"日志中的消息,您在中途。

        2. 注册负责所有Core Data操作的对象,以便在以下事件中收听NotificationCenterNSPersistentStoreCoordinatorStoresWillChangeNotification NSPersistentStoreCoordinatorStoresDidChangeNotification NSPersistentStoreDidImportUbiquitousContentChangesNotification

        3. 像这样:

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

          并正确处理更改。

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

          对我来说,问题是:

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

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

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

答案 1 :(得分:0)

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

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