生产中的 NSPersistentCloudKitContainer
NSPersistentCloudKitContainer in Production
我最近发布了一个使用 NSPersistentCloudKitContainer
的应用程序。在开发中,我的数据库按预期跨设备同步,但在生产中,我的数据库根本不同步。调试完情况后,我意识到我必须将 iCloud Schema 发布到生产环境中。但即使这样做之后,我的应用程序仍未在生产环境中跨设备同步。
有人遇到过这种情况吗? NSPersistentCloudKitContainer
我还需要做些什么才能投入生产吗?
我有同样的问题,在我的情况下,问题是我只激活了 "Debug" 部分中的功能,因为它是选择 "Signing & Capabilities"[= 时默认打开的选项卡11=]
仔细检查您是否也在 "Release" 部分激活了所需的功能。
尽管遵循了 NSPersistentCloudKitContainer
.
的 Apple 文档中的所有步骤,但我认为我已经解决了发生的问题,因为我遇到了同样的问题
为了确保您的核心数据实体都在开发环境中正确创建,在部署到生产环境之前,他们建议 运行(一次).shouldInitializeSchema
在您的 NSPersistentCloudKitContainer
.
问题是,这几个月都没有生效(见下文更多...)所以另一种方法 - 以及我的方法 - 是即时创建我的所有数据,通过 NSPersistentCloudKitContainer
保存到在开发环境中创建模式的核心数据。当它在我的设备上完美运行时,我将它部署到生产环境。
虽然它对我的数据运行良好,但它对我在现实世界中使用我的 App Store 版本的应用程序的任何用户都不起作用。真是让人头疼。
事实证明,我的核心数据模型的 CloudKit 架构中的一两个自定义类型中缺少一些自定义字段 - 我的模型中存在但我不再使用的属性(一个只是一个我从未使用过的空字符串)。
问题是,NSPersistentCloudKitContainer
不喜欢这样,即使 NSManagedObject
具有您不使用的属性,它们也必须存在于 CloudKit 模式中才能工作。似乎需要一个自定义字段来准确匹配核心数据模型中的每个属性。
为什么它在我的设备上工作可能与这样一个事实有关,即在过去的某个时候,这些自定义类型和自定义字段在重置之前都存在于开发环境中,到那个阶段我的设备拥有一切已经在 iCloud 中为他们准备好了。
自定义类型(如您的 CloudKit 仪表板所示)需要具有匹配相应实体的每个核心数据属性的自定义字段以及每个“一对一”关系的自定义字段(我也丢失了其中一个)。它们都是由 NSPersistentCloudKitContainer
.
自动生成的以 CD_
开头的字段
“对多”关系似乎存储在别处。
在 Apple 的帮助下,他们建议 运行 在容器上使用 .shouldInitializeSchema
替换 initializeCloudKitSchema(options:)
(尚未在他们的文档中!)(仅一次)以填补所有空白。
当我这样做时,我注意到它实际上根本没有添加任何缺失的自定义字段,当我“部署到生产环境”时,没有任何更改可做,而且它仍然在我的设备上工作,生产设备没有工作。经进一步分析,未添加缺失的字段...
因此,我确保将所有这些缺失的属性和“一对一”关系的一些数据写入我的测试设备,然后再试一次。
我可以看到它们现在都出现在我部署到生产环境的开发架构中。更改中列出了所有缺失的自定义类型和自定义字段。
现在我的用户都可以使用了!
多么复杂的过程。部分是我的错,部分是 Apple 的。
我最近发布了一个使用 NSPersistentCloudKitContainer
的应用程序。在开发中,我的数据库按预期跨设备同步,但在生产中,我的数据库根本不同步。调试完情况后,我意识到我必须将 iCloud Schema 发布到生产环境中。但即使这样做之后,我的应用程序仍未在生产环境中跨设备同步。
有人遇到过这种情况吗? NSPersistentCloudKitContainer
我还需要做些什么才能投入生产吗?
我有同样的问题,在我的情况下,问题是我只激活了 "Debug" 部分中的功能,因为它是选择 "Signing & Capabilities"[= 时默认打开的选项卡11=]
仔细检查您是否也在 "Release" 部分激活了所需的功能。
尽管遵循了 NSPersistentCloudKitContainer
.
为了确保您的核心数据实体都在开发环境中正确创建,在部署到生产环境之前,他们建议 运行(一次).shouldInitializeSchema
在您的 NSPersistentCloudKitContainer
.
问题是,这几个月都没有生效(见下文更多...)所以另一种方法 - 以及我的方法 - 是即时创建我的所有数据,通过 NSPersistentCloudKitContainer
保存到在开发环境中创建模式的核心数据。当它在我的设备上完美运行时,我将它部署到生产环境。
虽然它对我的数据运行良好,但它对我在现实世界中使用我的 App Store 版本的应用程序的任何用户都不起作用。真是让人头疼。
事实证明,我的核心数据模型的 CloudKit 架构中的一两个自定义类型中缺少一些自定义字段 - 我的模型中存在但我不再使用的属性(一个只是一个我从未使用过的空字符串)。
问题是,NSPersistentCloudKitContainer
不喜欢这样,即使 NSManagedObject
具有您不使用的属性,它们也必须存在于 CloudKit 模式中才能工作。似乎需要一个自定义字段来准确匹配核心数据模型中的每个属性。
为什么它在我的设备上工作可能与这样一个事实有关,即在过去的某个时候,这些自定义类型和自定义字段在重置之前都存在于开发环境中,到那个阶段我的设备拥有一切已经在 iCloud 中为他们准备好了。
自定义类型(如您的 CloudKit 仪表板所示)需要具有匹配相应实体的每个核心数据属性的自定义字段以及每个“一对一”关系的自定义字段(我也丢失了其中一个)。它们都是由 NSPersistentCloudKitContainer
.
CD_
开头的字段
“对多”关系似乎存储在别处。
在 Apple 的帮助下,他们建议 运行 在容器上使用 .shouldInitializeSchema
替换 initializeCloudKitSchema(options:)
(尚未在他们的文档中!)(仅一次)以填补所有空白。
当我这样做时,我注意到它实际上根本没有添加任何缺失的自定义字段,当我“部署到生产环境”时,没有任何更改可做,而且它仍然在我的设备上工作,生产设备没有工作。经进一步分析,未添加缺失的字段...
因此,我确保将所有这些缺失的属性和“一对一”关系的一些数据写入我的测试设备,然后再试一次。
我可以看到它们现在都出现在我部署到生产环境的开发架构中。更改中列出了所有缺失的自定义类型和自定义字段。
现在我的用户都可以使用了!
多么复杂的过程。部分是我的错,部分是 Apple 的。