我最近有一个使用Core Data
和CloudKit
的生产应用程序的问题,其中数据在设备之间不同步,经过一点点研究,我发现私有CloudKit容器中的模式需要初始化;而我从来没有这样做过。
我仍然不是100%确定的部分是什么时候运行initializeCloudKitSchema
方法后,应用程序已发布到AppStore。我看到苹果建议在测试时使用#if DEBUG
运行它,但是…你真的想每次在Xcode中编译时都运行它吗?
我是这样理解的……
- 应用发布,调用
initializeCloudKitSchema()
匹配Core Data
和CloudKit
之间的schema - 添加或删除和属性,调用
initializeCloudKitSchema()
更新CloudKit
模式。 - 重命名属性,调用
initializeCloudKitSchema()
来更新CloudKit
模式。等。
如果我上面的假设是正确的,在开发过程中调用initializeCloudKitSchema()
方法将在新应用程序版本在AppStore发布之前更新CloudKit
中的模式,因此为使用以前版本的应用程序的现有用户创建一个问题,因为他们将没有最新的代码,但将使用包含新属性的最新模式。
有人可以分享他们的方法处理模式更新后,CloudKit
的应用程序已经发布到AppStore?
代码:
do {
try container.initializeCloudKitSchema()
} catch {
print(error)
}
在我的例子中,我甚至不需要运行initializeCloudKitSchema()
方法。以下是我所做的对我有用的事情。
-
我在两台设备上进行了本地测试,并确保一切都如预期的那样同步。这当然是在Xcode的沙箱环境中使用测试登录帐户完成的。
-
然后我去开发
CloudKit
容器,点击Deploy Schema Changes
。 -
最后,我使用生产/普通用户帐户直接从两个不同的设备上的app Store下载了这款应用并进行了测试。
- 完成
理论上,一旦您对模式和测试环境中的结果感到满意,您就需要将模式部署到Production CloudKit容器中,方法是执行上述或者调用initializeCloudKitSchema()
(我没有尝试过)。
旁注:看起来一旦你将模式部署到生产CloudKit容器中,你就不能再删除或重命名实体或属性了。此外,每次更新Core Data模式时都必须执行上述操作。请记住,如果您在Core Data中添加或删除实体或属性,您必须创建一个新版本的Core Data容器来执行所谓的轻迁移。