💡 修复 Core Data/SwiftData 上架后的云同步问题

为您每周带来有关 Swift 和 SwiftUI 的精选资讯!

TL;DR:Core Data 或 SwiftData 云同步在上架后失效,问题通常来自于 CloudKit 开发环境与生产环境的分离机制。需在 CloudKit 控制面板手动部署 Schema 到生产环境,并配置正确的 entitlement 文件。TestFlight 默认使用生产环境,可通过配置切换至开发环境。

问题

许多开发者(尤其是首次使用云同步功能的开发者)可能会遇到这样的情况:在开发过程中,Core Data 或 SwiftData 的云同步功能运行良好,但应用登录 App Store 后,用户数据却无法同步。

原因分析

这是因为 CloudKit 将数据分为开发环境和生产环境。开发环境中保存的是开发过程中生成的数据,而生产环境用于用户实际使用的应用。 开发过程中,开发环境中的容器会自动根据本地数据模型生成相应的 Schema(数据模型结构)。但在应用上线到 TestFlight 或 App Store 前,开发者需要手动将 Schema 部署到生产环境,否则用户数据无法同步。

解决方案

1. 部署 Schema 到生产环境

在 CloudKit 仪表盘中,手动将 Schema 从开发环境部署到生产环境。完成部署后,生产环境的容器会包含与本地数据模型对应的 Schema。

Deploy Schema

2. 部署时机

每次提交到 App Store 前,如数据模型有变更,必须重新部署 Schema 到生产环境。

3. 确保正确的 entitlement 配置

默认情况下,TestFlight 使用生产环境数据。如果希望 TestFlight 使用开发环境数据,需在 entitlement 文件中设置 com.apple.developer.icloud-container-environmentDevelopment

XML
<key>com.apple.developer.icloud-services</key>
<array>
    <string>CloudDocuments</string>
    <string>CloudKit</string>
</array>
<key>com.apple.developer.icloud-container-environment</key>
<string>Development</string>

4. 重置开发环境(可选)

在开发过程中,可通过 CloudKit 控制面板的 Reset Environment 功能重置开发环境,清除所有数据和 Schema,以确保开发环境的干净状态。

Reset Environment

延伸阅读