使用 cktool

开始之前

安装 App

默认情况下,从 Xcode 13 起,cktool 会随 Xcode 一起分发。Xcode 13 可从 Mac App Store 下载。

一般用法

cktool 是无状态的,可以在单次操作中将所有操作传递给 CloudKit Management API。可通过 help 命令或 man 页面获取受支持操作的完整列表:

xcrun cktool --help
OVERVIEW: CloudKit Command Line Tool

USAGE: cktool <subcommand>

OPTIONS:
	-h, --help				Show help information.

SUBCOMMANDS: ...

向 CloudKit 认证 cktool

cktool 支持管理令牌和用户令牌,并会将它们安全地储存在 Mac 钥匙串中。你可以使用 save-token 命令添加令牌,此命令将在提示用户提供信息后启动 CloudKit Console 以拷贝相应的令牌:

xcrun cktool save-token			\
	--type [management | user]

发出架构管理命令

架构管理命令要求提供管理令牌。提供后,cktool 可以执行以下命令:

重置开发架构:这让你可以将开发数据库恢复为当前的生产定义。

xcrun cktool reset-schema	\
	--team-id [TEAM-ID]		\
	--container-id [CONTAINER]

导出架构文件:这让你可以将现有 CloudKit 数据库架构定义存储到文件中,此文件可以与相关源代码一起保存:

xcrun cktool export-schema 		\
	--team-id [TEAM-ID]			\
	--container-id [CONTAINER]	\
	--environment [development | production]	\
	[--output-file schema.ckdb]

导入架构文件:这会对开发数据库应用基于文件的架构定义以进行测试。

xcrun cktool import-schema 		\
	--team-id [TEAM-ID]			\
	--container-id [CONTAINER]	\
	--environment development 	\
	--file schema.ckdb

发出数据命令

当用户令牌可用时,cktool 可以代表用户访问公共数据库和私有数据库。这可用于在集成测试之前获取数据和插入新记录。请注意,由于用户令牌的使用期限短,因此可能需要频繁进行交互式认证。

可以使用 query-records 命令来查询记录。请注意,如果在查询中没有使用筛选器,则需要对 ___recordID 应用 Queryable 索引,就像在可选的 --filters 参数中指定的字段那样:

xcrun cktool query-records		\
	--team-id [TEAMID] 			\
	--container-id [CONTAINER] 	\
	--zone-name [ZONE_NAME] 		\
	--database-type [public | private] 	\
	--environment [development | production]	\
	--record-type [RECORD_TYPE]	\
	[--filters [FILTER_1] [FILTER_2]]

其中 FILTER_1 采用 "[FIELD_NAME] [OPERATOR] [VALUE]" 形式,例如 "lastname == Appleseed"

插入数据通过 create-record 命令完成:

xcrun cktool create-record		\
	--team-id [TEAM_ID]			\
	--container-id [CONTAINER]	\
	--zone-name [ZONE_NAME] 		\
	--database-type [public | private] 	\
	--environment [development | production]	\
	--record-type [RECORD_TYPE]	\
	[--fields-json [FIELDS_JSON]]

其中 FIELDS_JSON 是要在记录中设置的字段的 JSON 表示形式。例如:

'{
	"firstName": {
	"type": "stringType",
	"value": "Johnny"
 },
	"lastName": {
	"type": "stringType",
	"value": "Appleseed"
 }
}'