我最近发布了一个使用NSPersistentCloudKitContainer
的应用。在开发中,我的数据库正在按预期跨设备同步,但是在生产中,我的数据库根本不同步。调试完情况后,我意识到必须将iCloud Schema发布到生产环境中。但是即使这样做,我的应用也无法在生产环境中的设备之间进行同步。
有人经历过吗?为了使NSPersistentCloudKitContainer
投入生产,我还需要做些其他事情吗?
答案 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)