Highlight
Apple 推出 CloudKit Console,让开发者在浏览器中管理 CloudKit Schema、查询记录、部署生产变更、查看 Telemetry 和 Logs,降低调试同步数据与排查线上问题的成本。
核心内容
开发者把数据放进 CloudKit(iCloud 数据库服务)以后,真正麻烦的工作常常发生在上线前后。
开发阶段,你需要确认新的记录类型已经写入开发环境,字段类型没有填错,索引能支撑查询。上线前,你还要把开发环境的 Schema 推到生产环境,并确认这次部署不会破坏旧客户端。上线后,用户反馈同步失败,你需要知道请求有没有到达 CloudKit,错误数有没有在新版本发布后上升。
过去这些动作分散在不同视图里。定位一个问题时,开发者要先找容器,再切环境,再查记录,最后还要去看日志或指标。CloudKit Console 把这些动作放进一个统一界面:Database 负责 Schema 和记录,Telemetry 负责聚合指标,Logs 负责请求级别排查。
Apple 这次的改变没有引入新的客户端框架。它改的是 CloudKit 的开发者工作台。对使用 CloudKit 的 App 来说,这能直接缩短“写入数据—验证数据—部署 Schema—观察线上行为”的循环。
详细内容
管理 Schema:Record Type、字段和索引
(01:24)CloudKit 数据库位于 Container(容器)内。每个容器有 Development(开发环境)和 Production(生产环境)两个环境。开发者可以在开发环境使用 just-in-time schema creation(即时 Schema 创建),也可以在 Console 中定义数据模型。
(02:21)Record Type(记录类型)定义 CloudKit 数据结构。Console 的 Schema 页面可以查看记录类型、字段和索引。演讲示例中,开发者为 author 字段添加 sortable index(可排序索引),用于按字母顺序排序。
这场 session 没有 Code tab。下面的脚本把 Console 中的配置整理成可运行的数据结构,便于核对每一步。Console 本身通过网页完成这些操作。
const bookRecordType = {
name: "Book",
fields: [
{ name: "title", type: "String" },
{ name: "author", type: "String" }
],
indexes: [
{ field: "author", type: "sortable" }
]
};
const sortableFields = bookRecordType.indexes
.filter((index) => index.type === "sortable")
.map((index) => index.field);
console.log(`${bookRecordType.name} can sort by: ${sortableFields.join(", ")}`);
关键点:
name: "Book"对应 Console 中的 Record Type。fields列出记录类型包含的字段;演讲中添加字段时需要输入字段名并选择类型。author是演讲里用于 sortable index 的字段。indexes表示 Console 中创建的索引;演讲提到创建索引时要选择字段和三种索引类型之一。filter((index) => index.type === "sortable")模拟上线前检查:哪些字段支持排序。
用 Query Builder 验证开发环境记录
(03:35)Database app 的记录浏览采用从左到右的流程:先选择 Database(数据库),再选择 Zone(区域),最后选择 Record Type。选好上下文后,左侧显示记录列表,中间显示记录详情。
(04:02)Query Builder(查询构建器)可以添加过滤条件,找到目标记录。查询可以保存,之后继续开发时直接复用。Console 的 URL 也能指向具体功能,开发者可以把记录视图加入 Safari 书签。
const savedQuery = {
environment: "Development",
database: "Public",
zone: "_defaultZone",
recordType: "Book",
filters: [
{ field: "author", operator: "equals", value: "Octavia Butler" }
]
};
function describeQuery(query) {
const filterText = query.filters
.map((filter) => `${filter.field} ${filter.operator} ${filter.value}`)
.join(" AND ");
return `${query.environment}/${query.database}/${query.zone}/${query.recordType}: ${filterText}`;
}
console.log(describeQuery(savedQuery));
关键点:
environment: "Development"对应演讲中先在开发环境验证数据的流程。database、zone、recordType对应 Console 从左到右的三层选择。filters对应 Query Builder 里的过滤条件。describeQuery把一次查询变成可读文本,模拟保存查询前的人工核对。- 真实查询在 CloudKit Console 网页中执行,这段脚本用于记录团队约定的查询条件。
部署 Schema:先看 diff,再进生产环境
(05:08)开发环境中的 Schema 准备好后,点击 Deploy Schema Changes 会进入变更视图。这个视图展示生产环境当前 Schema 与开发环境待部署变更之间的差异。
(05:33)生产环境变更无法反向撤销。diff 视图的作用是让开发者确认只有预期改动会进入生产环境。CloudKit 也会验证更新完整性,避免破坏旧客户端。
const productionSchema = {
recordTypes: {
Book: {
fields: ["title"],
indexes: []
}
}
};
const developmentSchema = {
recordTypes: {
Book: {
fields: ["title", "author"],
indexes: ["author:sortable"]
}
}
};
const changes = {
addedFields: developmentSchema.recordTypes.Book.fields
.filter((field) => !productionSchema.recordTypes.Book.fields.includes(field)),
addedIndexes: developmentSchema.recordTypes.Book.indexes
.filter((index) => !productionSchema.recordTypes.Book.indexes.includes(index))
};
console.log(JSON.stringify(changes, null, 2));
关键点:
productionSchema表示当前生产环境状态。developmentSchema表示开发环境中准备部署的状态。addedFields找出将被加入生产环境的字段。addedIndexes找出将被加入生产环境的索引。JSON.stringify(changes, null, 2)输出类似 diff 的结果,提醒开发者在点击部署前逐项确认。
用 Telemetry 和 Logs 排查线上行为
(05:46)Schema 部署后,Telemetry app(遥测工具)展示 App 与 CloudKit 数据库交互的关键指标。演讲列出的指标包括 Request Rate(请求速率)、Server Latency(服务器延迟)、Error Count(错误数量)和 Average Request Size(平均请求大小)。这些图表支持过滤,用来观察 App 行为随时间的变化。
(06:20)Logs app(日志工具)提供更细的请求处理输出。开发阶段可以用它验证请求,生产环境可以用它调查问题。
const telemetry = [
{ version: "1.0", requestRate: 120, serverLatencyMs: 80, errorCount: 2, averageRequestSizeKb: 14 },
{ version: "1.1", requestRate: 160, serverLatencyMs: 95, errorCount: 18, averageRequestSizeKb: 15 }
];
const previous = telemetry[0];
const current = telemetry[1];
const errorIncrease = current.errorCount - previous.errorCount;
const needsLogReview = errorIncrease > 10;
console.log({
version: current.version,
errorIncrease,
needsLogReview
});
关键点:
telemetry使用演讲中列出的四个指标:请求速率、服务器延迟、错误数量、平均请求大小。version对应演讲中“新版本行为是否异常”的观察场景。errorIncrease用来判断错误数量是否在新版本后上升。needsLogReview表示下一步应进入 Logs app 查看请求级别细节。- Telemetry 给出趋势,Logs 用于查看请求实际如何被 CloudKit 处理。
核心启发
-
做什么:给团队做一份 CloudKit 上线检查单。 为什么值得做:Console 的 diff 视图能展示开发环境到生产环境的 Schema 改动,生产变更无法反向撤销。 怎么开始:把每次要部署的 Record Type、字段和索引列成清单,在点击
Deploy Schema Changes前对照 diff 逐项确认。 -
做什么:为常用调试场景保存 Query Builder 查询。 为什么值得做:演讲中展示了保存查询并在后续开发中复用的流程,适合反复验证同一类测试记录。 怎么开始:按 Database、Zone、Record Type 设置上下文,再为关键字段添加过滤条件,把结果页面或功能 URL 加入书签。
-
做什么:给新版本发布建立 CloudKit Telemetry 观察窗口。 为什么值得做:Telemetry 能展示请求速率、服务器延迟、错误数量和平均请求大小,适合检查新版本是否改变了数据库交互行为。 怎么开始:发布后固定查看 Error Count 和 Server Latency;如果指标升高,再进入 Logs app 查看同一时间段的请求处理细节。
-
做什么:把开发环境写入验证加入功能开发流程。 为什么值得做:Console 可以直接查看开发环境里的记录详情,能确认 App 实际写入 CloudKit 的内容。 怎么开始:每新增一个 Record Type,先在 Development 环境写入测试数据,再用 Query Builder 过滤目标记录并检查字段值。
-
做什么:为 Public Database 的安全角色做上线前复核。 为什么值得做:演讲提到 Public Database 的 security roles(安全角色)有新的 UI,用于管理公共数据库记录访问权限。 怎么开始:在 Schema 管理阶段打开 security roles 页面,检查读写权限是否符合产品预期,再部署到 Production。
关联 Session
- What’s new in CloudKit — 了解 2021 年 CloudKit 的新能力,适合和 CloudKit Console 一起看。
- Automate CloudKit tests with cktool and declarative schema — 用命令行和声明式 Schema 自动化测试,补足 Console 的手动操作流程。
- Build apps that share data through CloudKit and Core Data — 讲解 Core Data 与 CloudKit 共享数据的应用架构。
- Sync files to the cloud with FileProvider on macOS — 展示另一个云同步场景,关注文件级同步方案。
评论
GitHub Issues · utterances