如何让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启动和运行?你能解释一下如何完成它吗?

+1

您是否尝试在iPhone模拟器(在设置菜单中)登录到您的iCloud帐户? – ninjaproger

+0

是的,当然:) –

+0

我有一堆代码告诉我在控制台中是否启用iCloud。因此,如果iCloud在MagicalRecord框架之外未正确设置,我会收到错误消息。现在我没有错误,因此一切都应该工作,但它不是 –

好吧,我认为我有工作。

UPDATE最初它适用于我,但我有一些非常奇怪的效果,事实是,如果你从iCloud注销无处不在的容器被删除,让我想到替代解决方案。现在我使用Ensembles库,对它大多非常满意。 END UPDATE

我刚刚推出了我自己的测试应用程序,我写了2年前,没有CoreData和iCloud,它似乎工作很好。它通过我的iPhone和iPhone模拟器同步数据库。导致我坚果的一件小事是,我仍然没有看到任何东西https://developer.icloud.com ..

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

  1. 所有这些东西的好处是,你几乎不用做什么的开发者门户网站(如创建和下载的provisioning profile,甚至创建应用程序ID是没有必要的) - XCode 6.3.2为你做了这一切;如果你知道订单,当然。首先,转到目标的设置 - >功能,然后启用iCloud。 Xcode执行添加Entitlements文件,在开发者门户创建App ID并创建iCloud容器的工作。取消选中“Key-Value Storage”并选中“iCloud Documents”。

Enabling iCloud in XCode

  1. 我假定您使用MagicalRecord和您设置您的核心数据堆栈如下:
  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驱动并启用它。用您的帐户登录到iCloud。 这对整个工作来说至关重要。
    2. iCloud Settings on the Device

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

      2. 注册,负责所有的核心数据行动听NotificationCenter对以下事件的对象: NSPersistentStoreCoordinatorStoresWillChangeNotification NSPersistentStoreCoordinatorStoresDidChangeNotification NSPersistentStoreDidImportUbiquitousContentChangesNotification

      3. 这样的:

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

        和处理更改正确。

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

        对于我的问题是:

  • 如何在远程存储上的变化作出反应
  • 如何合并不同的数据,避免重复
  • 如何避免数据完全丢失,如果iCloud的容器是空的

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

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


开始=> 开始=> 开始=>

上面所做的是正确的,但需要检查一些事项。

  • 确保您的供应配置文件设置正确。
  • 检查您的配置文件字符串是否有拼写错误。
  • 确保您已下载并安装新的供应配置文件。
  • 检查您的本地商店名称是否存在拼写错误。
+0

嗨Beau Young,谢谢你的回答,我将在稍后测试它。你有它运作良好吗? –

+0

然后我确实把它拉出来,并决定直接使用核心数据。很快我会重写并转移到这个https://realm.io –

+0

感谢@Beau Young提出realm.io,听起来像一个伟大的图书馆,完全免费。但是,我没有发现任何地方的同步功能,这将是这个跨平台数据库的杀手锏。 –