生产中的NSPersistentCloudKitContainer

时间:2019-10-03 12:12:51

标签: ios nspersistentcloudkitcontainer

我最近发布了一个使用NSPersistentCloudKitContainer的应用。在开发中,我的数据库正在按预期跨设备同步,但是在生产中,我的数据库根本不同步。调试完情况后,我意识到必须将iCloud Schema发布到生产环境中。但是即使这样做,我的应用也无法在生产环境中的设备之间进行同步。

有人经历过吗?为了使NSPersistentCloudKitContainer投入生产,我还需要做些其他事情吗?

2 个答案:

答案 0 :(得分:5)

尽管我遵循了NSPersistentCloudKitContainer的Apple文档中的所有步骤,但我想出了遇到同样问题时正在发生的事情。

为确保在开发环境中正确创建了核心数据实体,在部署到生产环境之前,他们建议在.shouldInitializeSchema上运行NSPersistentCloudKitContainer(一次)。

问题是,这已经无效了几个月(请参阅下面的更多信息...),所以另一种方式(也是我的方式)是即时创建所有数据,保存到通过NSPersistentCloudKitContainer在开发环境中创建架构的Core Data。然后,当它在我的设备上完美运行时,我将其部署到了生产环境。

使用我的App Store版本的应用程序,尽管它对我的数据运行得很好,但对于现实世界中的任何用户而言,它都不起作用。这是一个真正的抓头人。

事实证明,我的核心数据模型的CloudKit架构中的一两个自定义类型中缺少一些自定义字段-我的模型中存在但不再使用的属性(一个只是一个空字符串,我从不使用)。

问题是,NSPersistentCloudKitContainer不喜欢这样,即使NSManagedObject具有您不使用的属性,它们也必须存在于CloudKit架构中才能起作用。似乎需要一个自定义字段来完全匹配Core Data模型中的每个属性。

为什么它可以在我的设备上运行可能与以下事实有关:在过去的某个时候,这些自定义类型和自定义字段在重置之前都存在于开发环境中,在此阶段,我的设备已将所有东西准备就绪已经在iCloud中为他们服务了。

自定义类型(如您的CloudKit仪表板所示)需要具有与相应实体的每个核心数据属性匹配的自定义字段,以及与每个“一对一”关系的自定义字段(我缺少其中一个太)。它们都是以CD_自动生成的以NSPersistentCloudKitContainer开头的字段。

“多对多”关系似乎存储在其他位置。

在Apple的帮助下,他们建议在容器上运行.shouldInitializeSchema替换initializeCloudKitSchema(options:)(尚未在文档中!)(一次)以填补所有空白。

当我这样做时,我注意到它实际上根本没有添加任何缺失的“自定义字段”,并且当我“部署到生产环境”时,无需进行任何更改,尽管它仍然可以在我的设备上运行,但生产设备却没有。工作。经过进一步分析,未添加缺少的字段...

因此,相反,我确保将所有这些缺少的属性和“一对一”关系的数据写入我的测试设备,然后重试。

我可以看到它们现在都已存在于我部署到生产中的开发模式中。更改中列出了所有缺少的“自定义类型”和“自定义字段”。

现在所有内容都对我的用户有效!

多么复杂的过程。部分是我的错,部分是苹果的错。

答案 1 :(得分:0)

我遇到了同样的问题,就我而言,问题是我只激活了“调试”部分中的功能,因为这是选择“签名和功能”时默认打开的选项卡

再次检查您是否还在激活“发布”部分中的所需功能。

enter image description here