大多数浏览器和
Developer App 均支持流媒体播放。
-
利用 App Intents 为用户奉上 App 的核心功能
了解 App Intents 框架的要素 (例如,意图、实体和查询),以及如何利用这些要素恰到好处地显示 App 最重要的功能以满足用户所需。了解如何将你的 App 与众多基于 App Intents 的系统功能深度整合起来,这些功能包括 Siri、控件和小组件、Apple Pencil、快捷指令、操作按钮等等。获取相关的技巧,学习如何高效实现 App Intents 整合,以打造全方位的卓越体验,同时仍能共享代码和核心功能。
章节
- 0:00 - Introduction
- 1:29 - Friction versus flow
- 5:44 - Understanding the framework
- 8:06 - Building the code
资源
- Accelerating app interactions with App Intents
- App Intents
- Creating your first app intent
- Forum: Machine Learning and AI
- Making actions and content discoverable and widely available
相关视频
WWDC24
WWDC23
-
下载
大家好! 欢迎观看“利用 App Intents 为用户奉上 App 的核心功能” 我叫 Christopher Nebel 是 App Intents 团队的一名工程师
这是我的 App 类似的 App 有很多 但这款 App 是我的杰作 实际上 这是示例代码 可通过开发者网站获取 这是一个路线目录 本视频中 我们会反复看到这个目录 我们开始吧 不管怎样 我开发的这款 App 非常棒 许多用户告诉我 使用它是一种享受 那不使用的时候又怎么样呢? 没什么存在感 只能 在主屏幕上看到一个方框? 那可不一定! 借助恰当的代码 就可以 把这个 App 中的功能提取出来 放到设备中的其他位置 让用户可以直接通过“聚焦”或 与 Siri 对话来执行 App 中的操作
也可以将信息添加到 小组件中 放到主屏幕上
或者 将操作和状态 添加到“控制中心” 这样 用户即使没有打开这个 App 也能继续使用其中的功能
这就是 App Intents 以及 它支持的功能所带来的精彩体验 具体该怎么操作? 你来对地方了 我将为大家介绍如何提升 App 使用体验的流畅度 以及一系列能帮你做到 这一点的系统功能 什么是 App Intents?它如何 与这些功能实现默契配合? 如何针对你的 App 开始构建 App Intents?
流畅度对于愉悦的使用体验非常重要 在心理学中 流畅度是指 思维与行动完美衔接 想做什么就做什么 毫不费力 对设备来说 流畅度是指 你需要完成的下一项操作触手可及 那些对流畅度产生干扰的 额外步骤叫作摩擦 好比是任何阻碍你完成任务的因素 类似的表达还有很多: 表面粗糙 摩擦力很大 卡壳了 真是个累赘 摩擦力很小 顺畅无阻 就像一台运转良好的机器 非常丝滑 有点摩擦或许是件好事 我并不想提完全无摩擦的表面 但通常来说 我们都想 尽可能减少摩擦 摩擦不一定都是大问题 它往往是一个反复出现的小问题 比如 在使用设备时 你需要切换 App
你的 App 打造了一个小世界 就像是你精心打造的一个盒子 盒子里的一切都很完美 问题是 用户不会只用一款 App 来 处理各种任务 而是会用到许多 App 如果需要在盒子之间切换 该怎么办? 每个 App 都是一个不同的盒子 默认情况下 要查看某个盒子 或在其中执行任一操作 唯一的方法是进入这个盒子 但这意味着 你无法查看 其他盒子中的内容 也无法 在任何其他盒子中执行任何操作 你需要离开当前的盒子 进入另一个盒子 也就是说 你需要在 App 之间切换
在 App 之间切换 并不困难 但也并非一点代价都没有 来回导航需要时间 也需要你 进行思考 这就是摩擦 如果设备了解你盒子中的 核心功能 会怎么样呢? 设备可以把这些核心功能 放在盒子外更显眼的地方 让用户可以更轻松快捷地 访问这些功能 有一整套的系统功能 都基于这一理念打造而成 让设备的使用体验变得更加顺畅 我们来看几个示例 稍后 我将构建所有这些示例 这些内容都基于我的示例 App 这个 App 显示了一个区域内的 路线目录 以及各种相关信息 有些功能可以帮助我更快地前往 App 中的正确位置 比如在“聚焦”中进行搜索 假设我现在位于主屏幕 想要查看置顶的路线 于是 我打开了“聚焦” 我还没输入任何内容 聚焦建议功能就猜到 我想搜索我的示例 App 并显示了我所需的 App 快捷指令 如果它没猜到 我就得输入:e、x、a 现在 它确定我要使用示例 App 于是“最佳搜索结果”中 显示了这个建议 并且 App 快捷指令 也显示在更显眼的位置
或者 我也可以从任意位置 告诉 Siri 我想要做什么
有些功能不仅仅 让 App 切换变得更便捷 它们甚至让我从一开始 就不需要切换 App 假设我想留意一下 我最常用路线的状况
我可以通过一个小组件 将相关信息添加到主屏幕上 而不必每次想到 这个 App 再打开它 现在我可以在做其他事情时 顺便扫一眼这个小组件 我可以把它添加到锁定屏幕上 这样甚至都不用解锁手机了
也可以在“控制中心”内 添加一个自定控件 以便在使用任何其他 App 时随时访问它
有很多类似的功能 我们还在不断添加 去年 我们添加了操作按钮 今年 我们将添加相机拍摄、 Apple Pencil Pro 的轻捏手势等 所有这些功能都有助于 将你的 App 功能提取出来 让它们成为整个设备体验的一部分 简化从“我想做这件事” 到“这件事已做完”之间的流程 这些功能之间有一个重要的区别: 由谁来选择要提取哪些功能?
对于“聚焦”这样的功能 由像你一样的开发者做出选择 你着重指明 App 中的重要操作 设备 会在恰当的位置 自动显示这些操作 你的 App 中的操作 似乎总是触手可及 让用户无论处在设备上的哪个位置 都感觉顺畅无阻
而对于“小组件”和“控件” 这样的功能 由用户做出选择 你提供灵活的组件 供用户 精确选择对自己重要的组件 然后打造恰当的工作流 换句话说 他们能够对你的 App 使用体验进行个性化设置 让设备成为自己的延伸 甚至是个性展示 这对用户和开发者双方都有益 因为用户可根据自身和生活的需要 对你的 App 进行自定的程度越高 用户就越有可能 继续使用这个 App 这个时候 你可能会说 这听起来不错 我希望自己的 App 能够提供 顺畅的使用体验 我该怎么做呢? 很高兴你能提出这个问题! 答案是 借助 App Intents 你会说等等 什么? 我原以为我们讨论的是 Siri、 控制中心以及其他各种炫酷的功能 我会说 是的 让我解释一下
App Intents 本身并不是一项功能 而是构建各种功能的通用基础 我们讨论过的所有这些功能 Siri、聚焦、快捷指令等等 都有一个共同的特点: 它们会获取 App 内的核心功能 以及对用户有意义的操作和内容 并将这些操作和内容 在 App 之外呈现 要做到这一点 你需要以系统能够 理解的方式公开 App 的核心功能 而 App Intents 正是 完成这项任务的框架 这款工具可帮你 完成两项重要工作: 首先 定义你的核心操作和内容 让 Siri 和“聚焦”等系统功能 了解它们所能呈现的内容 其次 要实际呈现一些内容 你的 App 和呈现程序之间就需要来回通信 假如有人让 Siri 在你的 App 中执行一项操作 Siri 就需要给你的 App 发送一条执行这个操作的信息 然后你的 App 需要返回一条信息 告知它已经完成了 这就是结果
App Intents 会负责这类通信 让你 把精力集中在实现功能的实际行为上 这项工作最终只能 为一项系统功能提供支持吗? 这对各种系统功能也同样有用 因为它们都以 App Intents 为基础 因此你可以在它们之间 共享代码 甚至可以 使用完全相同的代码来支持多项功能 你需要编写三个顶层要素 具体我会在下一部分中介绍 意图会执行一项操作 例如 打开一个视图或开始记录一次徒步 它们是 App 中的命令或动词
实体是对象 如“路线”或“集合” 它们是名词 如果意图是动词 实体是名词 那么 App 快捷指令就是句子 它包含一个动词和一个名词 或一个需要填入名词的空白项 以及所有其他必需项 以便 描述 App 的一项重要功能 这项功能是任何使用这款 App 的人都需要做的事情 “聚焦”和操作按钮等功能 随后将提供这项功能 也就是那个句子 帮助用户 快速轻松地执行操作
这些要素共同决定了 App 在设备上的呈现方式 现在你已经有了大致的了解 接下来 我们编写一些代码
我要向我的 App 中添加一些功能 帮助提高它的流畅度 其中的五项分别为: 一个简单的快捷指令操作 不带任何参数 一个参数化的快捷指令操作 一个主屏幕小组件 一个控制中心控件 用于“聚焦”和 Siri 的 App 快捷指令 听起来有很多项 但它们 都基于 App Intents 框架 可以帮助我在不同功能 之间共享很多代码 我们这就开始吧。
“快捷指令” App 这个 功能强大的工具 可帮助用户探索、组合 和重组各种操作 从而创建自己的自定快捷指令 举个例子 我的同事 喜欢和女儿一起骑山地车 于是就通过我的 App 中的操作 创建了一个自定快捷指令 在某个地区随机选择一条自行车路线 作为开发者 我可能不会优先考虑 这项功能 因为它比较具体 但我可以提供快捷指令操作功能 让用户能够根据自己的需要 灵活创建相应操作 实现想要的结果
我最近添加了一项功能 可以 将某条路线固定到列表的顶部 这样 当我规划出行时 就可以 快速打开行程详细信息 回答各种问题 比如出行方式 我的朋友能不能携带爱犬等等 用起来还不错 但我希望 即使当前不在这款 App 中 也能快速访问相应的路线 所以 我们来创建一个快捷指令操作 用于在这款 App 中打开 相应置顶路线的详细信息 完成后 它在“快捷指令” App 中是这样的
在 App Intents 框架中 快捷指令操作是意图 而所有意图在“快捷指令” App 中都默认显示为操作
意图是一种遵从 App Intent 协议的类型 它由两个必要部分组成: 第一个部分是可以本地化的 标题 显示为操作名称 第二个部分是 perform 方法 用于执行操作 意图应始终是对 App 用户有意义的操作 在这里 OpenPinnedTrail 不属于内部实现
Perform 方法始终会返回一个结果 但结果可能是空的 就像这里一样
我希望通过运行意图打开这款 App 因为我要显示 App 中的视图 App Intents 会按照 我的指示完成这项操作 在这里 我通过 openAppWhenRun 发出指示
意图也可以使用其他参数 和信息来完成自己的工作 这个意图不需要任何参数或信息 但稍后我会介绍需要使用 其他参数或信息的意图
就这么简单!在“快捷指令” App 资源库中 我的新意图会显示为操作
如果我用这个操作 创建一个快捷指令 就可以在“快捷指令” App 中 运行使用 甚至还可以更进一步 将它添加到我的主屏幕中
轻点这个快捷指令 它就会运行 随即打开我的 App 并显示 我希望看到的置顶路线详细信息
这很棒 但我还需要一项操作 让我能够挑选要打开的路线 因此 我可以创建一个快捷指令 用于打开一条特定路线 或在运行时提示我选择路线 为此 我需要创建一个带参数的意图 这和第一个意图非常像 实际上 我打算直接复制 第一个意图 然后更改它的名称 要让意图在 App 中打开所含参数 需要使用一个特殊的协议 OpenIntent 我把它添加进来
OpenIntent 包含了 openAppWhenRun 的功能 所以我可以将后者删除
此外 我需要添加 这个协议定义的参数 参数就是标有 @Parameter 的普通属性 因此你可以添加额外的元数据 例如可本地化的标题 我认为这里应当是“Trail” 也就是路线 在我的 App 中 路线是核心内容类型 因此在这里我使用路线实体
这里需要注意两点: 首先 实体应该是 对 App 用户有意义的内容 所以它既不是数据库行 也不是 我要实现的内容 而是路线 其次 引用实体的参数应当是实体 而不是描述实体的数据 所以 这里使用的既不是路线名称 也不是 UUID 而是 TrailEntity
我更新了 perform 方法 以便导航到这个参数 大功告成了 但这个部分还没完成 我需要定义 TrailEntity
幸运的是 这并不是很难 实体是一种遵从 AppEntity 协议的类型 你可以直接沿用模型类型 如果你的模型足够小 可以 一次性全部加载到内存中 从而提供所有必要的实例 那就没问题 或者你可以创建专用实体类型 只引用你的实现 如果你只在需要时才创建模型实例 或模型实例包含的属性开销较大 而你的意图又不需要这些属性 就可以采用这种方法
在这个示例中 我将采用第二种方法 因此 TrailEntity 将引用 我的底层模型类型 Trail
实体可能具有属性 这里为“Trail Name” 它和参数很像 但位于 内容对象而不是命令上 实体必须具备三个要素: 一个 DisplayRepresentation 让设备能在菜单中执行绘制等操作 一个永久性标识符 以及一个查询
好的 什么是查询?
在介绍什么是查询之前 我想先介绍一下查询的作用 查询会将那些针对实体询问 的问题转换为实际的实体 为意图参数选择值时 需要回答两个问题: 第一个问题是 有哪些实体? 随后 设备可以显示一个 可供用户选择的选项列表 用户选中某个实体后 查询就会保存这个实体的 ID 然后 在需要运行意图时 查询就会发送保存的 ID 查询需要回答的第二个问题是: 这个 ID 属于哪个实体? 回答完后 它就可以填充意图参数 让你的意图代码获得一个实体 而不仅仅是一个 ID 具体代码是什么样的?
查询是一种遵从 EntityQuery 的类型 除了“有哪些实体”和 “这个 ID 属于哪个实体” 这两种方法外 还可以使用 其他几种方式来查询实体: 搜索字符串、按谓词搜索等等 EntityQuery 有几个子协议 每种问题分别对应一个 “有哪些实体”这个问题可由 EnumerableEntityQuery 处理 它定义了一个 allEntities 方法 就像这样 从概念上来说 这是最简单的查询形式 如果你使用 iOS 18 SDK 进行构建 App Intents 可以从这种方式中 派生出更复杂的方式 当然 只有在能够一次性 返回所有实体的情况下 才能使用这种方法 所以必须 能够将整个模型载入内存 如果做不到这一点 或者你可以 比自动派生的查询做得更好 就应该使用其他某个查询协议 由于这个例子很简单 因此可以使用这种方法
“这个 ID 属于哪个实体”这一问题 可由 EntityQuery 本身 使用 entities(for:) 方法来回答
它们可以合作处理 参数配置所需的所有内容
现在 我的意图已准备就绪 可以运行了 但我还应该添加一个参数 Summary
如果不用这个参数 我的意图会在 “快捷指令”App 中呈现这种效果 它可以正常工作 但很难看明白 因为它要打开的路线位置很不显眼
ParameterSummary 是一个自然语言语句 用于描述意图将要执行的操作 它包含所有基本参数的值 在这里是指要打开的路线 现在这个意图的作用变得更容易理解 并且随着我编辑参数 它还变得更容易识别
我们来看看它的实际效果 轻点 Trail 占位符后 可以 看到一个列表 供我挑选路线 这个查询提供选项 也支持搜索功能 选中一条路线后 它会以内联方式显示 让我立刻就能理解这个操作 在运行时可以完成什么任务 这就是 ParameterSummary 的作用
我现在其实不想选择路线 我想在它运行时选择一条 所以 我将清除这个参数 将这个快捷指令保存到主屏幕上
现在轻点这个快捷指令后 会显示一个类似的选择器 它也是由查询提供支持 我可以直接从主屏幕 或任何可以触发这个 快捷指令的位置使用它
快捷指令操作可以 让你的 App 更加灵活 用户可以将这类操作融入各种 工作流中 种类之多 超乎你的想象 我们来看一种更有针对性、更灵活 的信息显示方式 可让信息一目了然: 小组件 路线的大部分详细信息不会经常改变 路线不会移动到一个新的位置 当然 发生地震时除外
然而 路况确实会经常变化 所以保持密切关注会很方便
这种情况太适合使用小组件了 小组件设计巧妙 让信息一目了然 我可以制作一个小组件 只显示置顶路线的详细信息 但我想关注几条不同的路线 以便选择一条最佳路线 为此 需要确保小组件是可配置的 方便我设置要显示哪条路线 这意味着 我的小组件 需要使用 Trail 参数 这和我的 Open Trail 操作很相似
要创建小组件 我需要一个小组件定义 这个视频的主题并不是 WidgetKit 因此我跳过了视图 和时间线提供程序等细节 要进一步了解这方面的信息 请参考 WidgetKit 文档 如需了解有关结合使用小组件 和 App Intents 的更多详情 请查看 WWDC23 中的 “探索 App Intents 的增强功能”
在这里 我们需要介绍主体部分 尤其是 intent 参数 在这个 小组件中 我将意图类型设置为配置
配置意图是一种遵从 WidgetConfigurationIntent 的意图 它的工作原理很有趣
像所有意图一样 它需要有一个标题 我说过 我希望能在这个小组件中 配置路线 所以我要添加一个参数 它应该是一个 Trail 我已经为我的 OpenIntent 定义了一个 Trail 实体 我可以重复使用这个实体吗? 问得好 当然可以
我会把它设置为可选参数 这样 将小组件添加到主屏幕时 就可以将它留空 否则它的类型 将与 Open Trail 意图 中的参数类型相同 现在我有了一个路线状况小组件 可以针对任何路线进行配置 这样就可以根据需要 添加任意数量的路线 之前编写的 Trail 实体及相关查询 可针对配置选择一个值 不需要再编写一次 这很简单 我们再试试另一种方法: 控制中心控件 iOS 18 为这类控件提供了新的 API
和小组件一样 我希望这个控件 可以使用路线进行配置 轻点这个控件后 它应该在 App 中 打开相应路线的详细信息
在这里 我将只介绍与 App Intents 相关的控件内容 如需了解控件的完整详情 请参阅 “将 App 控件扩展到系统级别” 我们开始吧
总体来说控件是一种特殊的小组件 ControlWidget 它的主体定义了控件的外观和功能 我的目标是使用 App Intent 创建一个可配置的控件 这与可配置的小组件非常相似 因此我添加了 AppIntentControlConfiguration
我说过 它的外观应当是一个按钮 因此我添加了ControlWidgetButton
这是可配置的按钮控件的基本形状 我还需要一个意图类型来保存配置 这样就可以构建按钮内容 还需要一个意图实例 用于处理按钮被轻点时的情况 我们来思考一下 我说过 我希望配置中 有一个 Trail 参数 这听起来有点像之前 构建的 Open Trail 意图 我可以重复使用这个意图吗? 当然可以 对于 OpenTrail 我需要做一项调整 声明它遵从 ControlConfigurationIntent 这是一个扩展 不需要添加 意图中不具备的任何内容 因此主体部分是空的
完成后 就可以填充类型 并使用这个类型的已配置实例 来构建按钮的图像和文本
这里处理得非常巧妙 我还需要一个操作 它是一个意图 实例 用于打开配置好的路线 这和 OpenTrail 也很相似 但是我不需要创建 新的 OpenTrail 实例 因为我已经有一个 充当配置意图的实例 只需将它作为操作传递就可以 因为它已包含 Perform 方法 并按照我希望的方式进行了配置 我们看看效果如何
这是“控制中心”的新配置模式 我已经在左下角添加了新控件 并将这个控件配置为打开 Monterey Bay Coastal Trail 如果我停止编辑 就可以使用 这个控件了 只需轻点一下 意图就会运行 App 也会打开 并显示我配置的路线详细信息
接下来 我将把我的 App 中的某项操作设置为 可以自动在“聚焦” 和 Siri 中显示出来 从而打开置顶路线的详细信息 要实现这一点 我需要创建一个 App 快捷指令 App 快捷指令是开发者 围绕意图创建的包装器 作为 App 的某项重要功能独立存在
创建完成后 相应的 App 快捷指令 便可通过“聚焦”、操作按钮 和 Apple Pencil Pro 等各项 功能和配件呈现给用户 即使你的 App 不处于运行状态 甚至完全未运行过 也没有问题 我们来看看具体代码
我定义了一个 AppShortcutsProvider 它包含一个以 App 快捷指令 列表形式存在的静态成员 AppShortcut 封装了一个意图 这里是我之前创建的 OpenPinnedTrail 意图 请注意 这是一个意图实例 而不是类型 表示我可以在这里 预先填充部分或全部参数 因此我可以使用一个 带有大量参数的通用意图 将它封装为执行具体操作的 AppShortcut 快捷指令运行时 它将提示 输入所有未填充的必填项 所以用哪种方式都行 具体取决于 你想提供什么样的体验 这个意图没有任何参数 因此括号内是空的
由于可以通过 Siri 调用 App 快捷指令 这里显示了一个可以使用的短语列表 每个短语都必须包含 App 名称 接下来 是它在“聚焦”等位置 显示时使用的标题和图像
请注意 这里没有包含 任何类型的注册码 App Intents 框架会 自动检测提供程序 并处理注册事宜 因此 只要安装了这款 App 就可以使用我的 App 快捷指令
现在 App 快捷指令 就可以显示在“聚焦”中了
也可以通过与 Siri 对话来启动 系统会自动处理“聚焦”和 Siri 相关操作 用户只需安装 App 即可 但如果用户想自定设备 也可以通过操作按钮 和 Apple Pencil Pro 使用 App 快捷指令 这是一段代码中包含的四项功能 已经有 App 快捷指令了? 可以通过 Apple Pencil Pro 来启动 就像去年可以通过 操作按钮来自动启动一样
看起来不错 但与 Siri 的 互动不是太方便 首先 它会显示一个视图 这意味着 我至少要看向我的设备 其次 它会打开这个 App 这会让我退出当前使用的 App 因此让我们换一个不太一样的意图 这次是返回一条信息 我将创建一个意图 但它不会打开置顶的路线 而是以小片段的形式显示路线 如果用户没有看向屏幕 或使用的是 HomePod、AirPods 这类不带屏幕的设备 它会提醒用户
首先使用一个存根 perform 方法 第一步是获取置顶路线 第二步呢? 怎样在不使用 App 的情况下 显示或播报信息? 我将使用 result 方法 Perform 方法返回的结果 不仅仅是一个值 而是由丰富的信息构成的组合 包括 Siri 可以播报的对话内容 以及可以显示的片段视图
如果我让结果遵从 ProvidesDialog 和 ShowsSnippetView 我就可以 使用其他方法 返回采用对话框 和视图形式的结果 我可以根据情况 只提供对话框 或只提供视图 但在这里 我将同时返回两种结果
这里是我想让 Siri 播报的内容 可能和小片段中的文本内容不太一样 为方便起见 我在这里 使用了一个插值字符串 但这个参数实际上是一个 Intent Dialog 实例 它可以根据需要 支持单独的 Full 和 Supporting 对话框
然后提供了一个 SwiftUI 视图 我将使用一个单独的函数来获取视图 具体细节就不介绍了 其实 我可以使用一个带视图 构建器表达式的后置闭包 通过内联方式来提供视图 无论采用哪种方式 视图 都会像小组件一样存档 因而可以传送给 Siri 所以 你可以使用小组件 支持的任何 SwiftUI 功能
现在 如果我在向 Siri 发出指令时看向屏幕 它就会以小片段的形式 显示置顶路线的状况 如果关闭这个小片段 就会回到 上次离开的位置 所以无需手动返回 如果我没有看向屏幕 Siri 就会说出对话内容 如果我因忙着找靴子 而将手机放在口袋里 我甚至不需要拿出手机 直接向房间另一头的 HomePod 询问路况就可以了 好的 我刚刚介绍了很多功能 帮助用户简化我的 App 使用体验 甚至不需要使用很多代码 这就是 App Intents 的功能 只需表达一次核心概念 就可以在许多相关功能中重复使用 总结一下 你可以提升 App 使用体验的流畅度 用户可以更快完成任务 更加享受完成任务的过程 还能对 App 的使用方式进行调整 将它融入自己的生活 为此 我们可以借助 Siri、 快捷指令、小组件等功能 让用户即使不打开 你的 App 也能便捷使用 利用这些功能的方法就是使用 App Intents 因为它是所有功能的基础 这样你就不用了解那么多不同的 API 还可以在各项功能之间共享代码 想要了解更多信息?没问题! 这里是一些很棒的视频资料: 不管你是不是新手 都可以 观看“设计 App Intents” 了解如何制作优秀的 App Intent 如果你想进一步了解如何 将 App Intents 与 Siri 配合使用 请观看“带你的 App 登陆 Siri” 如果你已经安装 App Intents 希望了解自去年以来的新功能 请观看“App Intents 的新功能”
感谢观看!期待看到你 利用 App Intents 大展身手!
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。