大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 cktool 和声明式模式实现 CloudKit 测试的自动化
测试 CloudKit 容器从未如此简单。我们将向您介绍 cktool — 这是一个命令行实用工具,可以快速地对 CloudKit 进行配置。同时,您将了解一种让您能够快速构建容器原型,进而演进的新模式语言。我们还将向您展示如何在 Xcode 中运行测试之前,组合这些工具并配置您的容器。为了能充分了解本节内容,我们建议您先熟悉 CloudKit 及其开发和生产环境,并对记录和数据类型作基本的了解。
资源
相关视频
WWDC22
WWDC21
-
下载
嗨 我是拉什蒂 我是CloudKit团队的工程师 我很高兴向大家介绍 一个新的CloudKit开发者工具 以及全新的CloudKit架构语言 在本次会议中 我将谈谈为什么集成测试 对于与云集成的应用程序来说 可能具有挑战性 然后 我将演示cktool 我们新的CloudKit命令行开发者工具 你将了解如何在Xcode中 使用cktool来自动化测试装置 你将了解CloudKit 新的声明式架构语言 然后 我将以接下来的步骤总结 让我们开始吧
当你编写依赖云服务的应用程序时 你的应用程序 和你所依赖的服务之间 存在明确的契约 集成测试可以帮助你验证 与这些服务的交互方式 但由于一些原因 正确地自动化这些集成测试的设置 可能具有挑战性 首先 让服务器与你的应用程序 使用的数据模型保持同步 并没有那么容易 在你在应用程序开发期间 对架构进行迭代时 服务器上的架构必须与你的应用程序 在测试运行时使用的架构完全匹配 这一点很重要 此外 很难确保 每次测试运行时 你的测试是针对云中的一组 一致的示例数据运行的 尤其是当你的测试在测试过程中 修改了该数据的时候 CloudKit团队已经为你简化了这一切 使用我们刚推出的 新的CloudKit架构语言 你可以在应用程序代码旁边的文件中 声明你的CloudKit架构 然后将其签入版本控制 以便你能追踪 项目中的所有其他更改 以及始终确保 你的应用程序的数据模型 与你的CloudKit架构一致 使用新的cktool命令行开发者工具 你可以轻松地自动化 将此架构声明发送到 CloudKit服务器的过程 同时在运行测试之前在服务器上 创建一组一致的示例数据 让我直接开始使用cktool吧 首先 cktool随着Xcode 13一起安装 一旦你安装了Xcode 13 你可以立刻从终端开始使用cktool cktool是通过xcrun调用的 它提供了几个命令 例如 它可以在CloudKit服务器上创建记录 查询服务器上已经存在的记录 导入和导出新的架构语言文件 管理工具本身的授权等等 在使用cktool之前 需要了解一些 关于CloudKit授权的事情 由于cktool直接与 CloudKit服务器通信 所以需要先授权该工具 你可以选择只授权cktool 执行容器管理功能 例如架构导入 或者你可以另外授权该工具 访问容器中的数据 为此 CloudKit 引入了两个新概念 第一个被称为“管理令牌” cktool使用它 来管理你的CloudKit容器 管理令牌与单一开发者帐户绑定 如果该开发者是多个团队的成员 则可以在不同的开发者团队中使用 管理令牌仅用于 配置用例 比如架构导入和导出 这个令牌不提供 对容器中数据的任何访问 因此我们也引入了“用户令牌” 它可以用来授权该工具将数据写入 应用程序的容器的用户私有数据库 或应用程序的容器的公共数据库 我可以从CloudKit控制台 获得管理令牌和用户令牌 有关CloudKit控制台的更多信息 你可以查看《认识CloudKit控制台》 另一场WWDC21课程 现在我已经为我的开发者帐户 获得了管理令牌和用户令牌 我可以添加到工具中 该工具会将其安全地 存储在我的macOS钥匙串中 我准备好继续操作了 我现在可以开始做一些有趣的事情了 例如 我要一份 我的Apple开发者团队成员的名单 我得到了一份 我是其中一员的团队名单 太棒了 现在假设我在容器中定义了 一个数据库架构 我想在进行更改之前将其提交到 我的原代码存储库 通过cktool 这很容易做到 使用这个导出架构命令 我可以把我的开发架构下拉到 一个名为schema.ckdb的文件中 该文件采用我之前提到的 新CloudKit架构语言进行格式化 稍后我们将详细研究这个文件 通过cktool 我也可以将数据添加到我的容器中 这里 如果我有以JSON表示的示例值 比如这里的示例书籍记录 我可以使用这个JSON 作为该工具的输入 就像这样 在我的公共数据库中 创建一个记录 好了 现在你对该工具的操作 有了基本的了解 我将编写一个简单的三步骤脚本 从我的应用程序程序的 CloudKit容器的开发环境中 删除所有的数据 然后将我的架构声明发送到服务器 最后 加载一些测试数据 这样 我就可以在Xcode中 运行这个脚本 作为测试预操作的一部分 并确保我的CloudKit容器 始终处于一致的状态 并且在每次运行测试之前 我的应用程序使用的正是这个架构 因此 在Xcode中 我将为我的项目的应用程序编辑架构 并且在测试阶段选择预操作 现在 我可以添加一个 新的运行脚本操作 我将为我的应用程序目标 提供构建设置 这样脚本就有一个通往我的项目中的 架构文件的路径 在这里 我会粘贴一个cktool命令 来重置我的容器 然后 一个命令从我的 应用程序项目的文件中导入架构 最后 一个命令在我的容器的 公共数据库中 创建一个示例记录 请注意 由于这些命令是同步的 会一个接一个地执行 任何失败都会停止执行 以防出现不符合预期的情况 在这种情况下 我可以在实际运行测试之前 小心地解决 任何预测试问题 就是这样 现在 当我运行我的Xcode测试时 cktool将在运行之前准备好 我的CloudKit容器 完美 那么 如果我需要改变 我的应用程序的数据模型呢? 让我更进一步来讨论 CloudKit架构语言 事实上 我们来研究一下 这个schema.ckdb文件 我之前下载好的 该文件中 是新的CloudKit架构语言 一种描述我的架构中的 记录类型的强大方式 它易于阅读和编写 并且可以包含在我的项目 和我的应用程序代码中 在架构部分中 有记录类型 这完全反映了在CloudKit控制台中 我的容器所显示的记录类型 每一种记录类型都有多个字段 每个字段都有一个名称和数据类型 三下划线字段名是系统字段 是由CloudKit为每个记录类型创建的 在这些系统字段下面 是我的自定义字段 代表了我在CloudKit中 为这个记录类型 定义的应用程序数据 我可以为一个字段创建一个索引 比如一个可查询、可搜索 或可排序的索引 就像我在CloudKit控制台所做的那样 我在CloudKit架构语言中 通过在字段的 数据类型之后声明索引来做到这点 就像我的书籍记录类型中的 这个“标题”自定义字段一样 字段定义下面 是记录类型的安全角色设置 在这里 可以向每一个 命名的安全角色授予权限 比如这里的三个 内置系统安全角色 “创建者”指包括创建该记录的用户 “世界”包括所有用户 而“iCloud”包括任何已认证的用户 请注意 在CloudKit架构语言中 你可以包括单行和多行注释 使架构文件对你和你的团队来说 更具有可读性 在处理该文件时 CloudKit服务器会忽略注释 所以你可以随意将注释 放在你想放的地方 既然CloudKit架构语言 为开发者提供了一种 快速、灵活的方式 来声明和修改架构 那么记住CloudKit架构演变的 几个核心概念就很重要了 首先 你可以完全控制 容器开发环境中的记录类型 你可以在开发中添加和删除记录类型 也可以在这些记录类型中 添加和删除自定义字段 而没有任何限制 当然 新的记录类型 随时可以提升到生产环境中 新的字段也可以添加到生产环境的 现有记录类型中 但是一旦记录类型被推送到 容器的生产环境中 就不能被删除或重命名 记录类型中的自定义字段 也不能推送到生产环境中 也不能删除或重命名 这样做的原因 是为了确保CloudKit服务器 始终理解记录类型和字段 你的应用程序的旧版本可能仍在使用 这意味着 虽然你可以 在容器的开发环境中对架构声明 进行破坏性更改 但你无法将这些 破坏性更改提升到生产环境中 请注意 可以在生产环境中 添加和删除索引 也可以修改安全角色设置 所有这些架构提升概念 对CloudKit都不是新概念 但是从这个新的 基于文件的架构声明中获得的灵活性 意味着回顾和理解这些概念非常重要 现在你已经了解了cktool可以做什么 以及CloudKit架构语言的运作方式 我鼓励你在自己的项目中尝试这两者 用CloudKit控制台中的管理令牌 和用户令牌授权cktool 并探索它的命令 将你现有的CloudKit架构 导出为CloudKit架构语言文件 并将其添加到你的项目中 确保将其与你项目的其他部分 一起签入版本控制 用cktool为你的集成测试 编写一些设置步骤 并将脚本作为测试前操作 添加到Xcode方案中 从命令行管理 CloudKit容器的某些元素的能力 可以非常强大 在一个文件中 维护CloudKit架构的声明 以及所有其他应用程序代码 可以帮助你在整个开发生命周期中 保持它与数据模型的一致性 并将所有这些联系在一起 来自动化集成测试的云设置 会更好 我们很想知道 你用这些新工具做了什么 感谢你花时间了解 更多关于CloudKit的信息 以及你对WWDC21的关注 [音乐]
-
-
3:27 - cktool: Save tokens, get teams
xcrun cktool save-token --type management xcrun cktool save-token --type user xcrun cktool get-teams
-
3:45 - cktool: Export schema
xcrun cktool export-schema \ --team-id XYZ1234567 \ --container-id iCloud.com.WWDC21.Example \ --environment development \ --output-file schema.ckdb
-
4:07 - cktool: Create record
xcrun cktool create-record \ --team-id XYZ1234567 \ --container-id iCloud.com.WWDC21.Example \ --environment development \ --database-type public \ --record-type Book \ --fields-json '{ "title": { "type": "stringType", "value": "Treasure Island" }, "pageCount": { "type": "int64Type", "value": 304 } }'
-
5:05 - cktool: Test pre-action script
xcrun cktool reset-schema \ --team-id XYZ1234567 \ --container-id iCloud.com.WWDC21.Example xcrun cktool import-schema \ --team-id XYZ1234567 \ --container-id iCloud.com.WWDC21.Example \ --environment development \ --file $PROJECT_DIR/Example/CloudKitSchema.ckdb xcrun cktool create-record \ --team-id XYZ1234567 \ --container-id iCloud.com.WWDC21.Example \ --environment development \ --database-type public \ --record-type Book \ --fields-json '{ "title": { "type": "stringType", "value": "Great Expectations" }, "pageCount": { "type": "int64Type", "value": 544 }, "description": { "type": "stringType", "value": "Depiction of the education of an orphan nicknamed Pip" }, "publishedOn": { "type": "timestampType", "value": "1860-12-01T03:23:07.415Z" }, "reviewStatus": { "type": "int64Type", "value": 1 } }'
-
5:51 - Schema language file: Example
DEFINE SCHEMA RECORD TYPE Book ( "___createTime" TIMESTAMP, "___createdBy" REFERENCE, "___etag" STRING, "___modTime" TIMESTAMP, "___modifiedBy" REFERENCE, "___recordID" REFERENCE QUERYABLE, description STRING, pageCount INT64, publishedOn TIMESTAMP, reviewStatus INT64, // A single-line comment, for humans title STRING QUERYABLE, GRANT WRITE TO "_creator", GRANT CREATE TO "_icloud", GRANT READ TO "_world" );
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。