大多数浏览器和
Developer App 均支持流媒体播放。
-
给你的 intent(意图)授权
在为你的 app 创建一个 intent 时,你可以把它当成快捷指令的一部分使用,也可以询问 Siri 帮助人们快速完成任务。了解如何在使用 SiriKit 的内置 intent 处理时更轻松地采用 Siri,以及如何通过已开发的 intent app 扩展提高 Siri 的性能。我们还会向你展示如何利用 SiriKit 的功能来改善操作体验——比如图像和字幕,从而获得丰富的对话体验。同时,我们还将了解如何在代码库中优化对 intent 的支持,让开发者的工作更轻松。
资源
- Providing Hands-Free App Control with Intents
- Soup Chef: Accelerating App Interactions with Shortcuts
相关视频
WWDC20
-
下载
(你好 WWDC 2020) 大家好 欢迎来到 WWDC
大家好 谢谢你们加入我们 我的名字是 Roman 我是 Apple 的快捷指令工程师
今天 我将与大家分享一些技术和策略 来有效地在 app 中实现 Siri 和快捷指令的支持 首先我们来看一下 SiriKit 中的新 API (SiriKit 的新功能) 接下来 我们将学习 如何在您的 app 中调整自定义意图 (充分利用您的意图) 让我们从一个简单的概述开始 SiriKit 包含意图 和意图 UI 框架 您可以使用它们将您的服务与 Siri、 快捷指令和地图集成在一起 在 iOS 14 中 您可以使用意图 为小组件添加配置和智能 在意图 app 扩展完成用户请求后 意图 UI app 扩展 会在 Siri、快捷指令或地图界面中 显示自定义用户界面 意图 app 扩展 接收来自 SiriKit 的用户请求 并将其转换为 app 特有的操作 比如发送消息、播放音乐 获取当前天气状况或者点一份汤
SiriKit 定义了大量的系统意图 这些意图代表了人们执行的常见任务 对于系统意图来说 Siri 定义对话流 而您的 app 提供数据来完成交互 如果您的 app 允许人们执行一项 不适合任何 Sirikit 域的日常任务 您可以创建一个自定义意图来表示它
意图扩展程序的任务 是为 SiriKit 提供处理程序对象 您可以使用这些对象来处理特定的意图 您提供的这些对象 来自 handlerForIntent: 您的扩展程序的方法 让我们看看处理意图的生命周期 每次用户与一个意图交互时 无论是在解析、确认或处理阶段 意图处理程序都有 10 秒钟 来完成请求 当用户请求启动到您的扩展的连接时 10秒超时就开始了
发生这种情况时 如果您的扩展程序尚未运行 则系统将启动它 启动扩展所需的时间 取决于加载流程链接的 所有框架所需的时间 以及运行包含在流程或其链接的 任何框架中的 +loads 和静态初始化器 所需的时间
您的扩展还需要一些时间 来执行业务逻辑
因此 通过确保您的扩展 只链接它真正需要的框架 优化启动时间是很重要的 因为加载所有链接框架花费的时间 要计入 10 秒超时 处理一个请求所花费的时间 也会影响人们如何看待 与您的 app 的交互 Siri 交互的目的是快速和便捷 所以您应该避免让用户 在您的意图处理程序工作时等待
10 秒似乎很长 因为在大多数情况下 您的意图扩展 并不需要连接 app 链接的所有框架 您有机会最小化您导入的符号数量 意图扩展另一个值得注意的特点是 它们是模块化、独立运行的进程 比 app 占用的内存更少
然而有时使用扩展并不总是那么方便 在 iOS 14 中 我们引入了 app 内意图处理 现在 您可以选择 添加一个意图处理器到您的 app 中 您可以处理 SiriKit 请求 例如解析、确认、处理 让我们讨论几个好的用例 它们可以帮助您决定 什么时候在 app 和扩展中处理您的意图
启动或控制媒体播放 或开始锻炼 之前需要您执行解析和确认 您的意图扩展 然后在您的 app 中进行处理 现在在您的 app 过程中 这样做更有效率
在另一种情况下 如果处理您的意图会影响您的 app 在屏幕上实时显示的用户界面 它也是一个很好的 app 内意图处理的候选
app 内意图处理 也为新的用例提供了机会 这些用例以前由于扩展的内存限制 而无法实现 比如照片和视频处理
老实说 在某些情况下 app 的结构 不允许您将代码分解成 意图扩展或共享框架 但是 当然 要注意 app 的启动时间 因为它会消耗 10 秒超时 我们在本环节前面谈到过
当您在设计意图处理程序时 您应该评估哪些意图 需要在您的意图扩展中处理 哪些可以移动到您的 app 中
让我们看看如何在您的 app 中实现 对 app 内意图处理的支持
您需要做的第一件事 是确保您的 app 支持多个窗口 并采用了 UIScene 生命周期 当您的 app 响应 SiriKit 请求而启动时 它将在没有任何 UIScene 对象 连接到 app 的情况下启动 然后 您需要在您的 app 的目标的 Supported Intents(支持的意图)部分 列出您想在您的 app 中 处理的所有意图 最后 您需要在 app 的委托中 实现 handlerForIntent: method
此方法充当调度程序 将传入意图映射到 能够处理它们的对象 在实施中 检查意图参数的类型 并返回一个能够 处理该类型意图的对象 返回的对象必须采用 用于处理该意图的协议 例如 在处理 ProcessPhotoIntent 对象时 返回采用 ProcessPhotoIntentHandling 协议的一个对象
如果处理意图更新了 您 app 的用户界面 并要求您的用户在使用意图之前 查看 app 中的一些东西 您的意图处理程序可能需要确保 相关的用户界面 在处理阶段在屏幕上
您可以通过检查来确保 app 不在后台 如果是 通过响应 continueInApp 响应代码 要求系统打开它 让我们看看如何在 Xcode 中 添加 app 意图处理
最近我开始在家做饭了 所以我一直在用一个 叫 Recipe Assistant 的 app 它可以让我浏览我最喜欢的菜谱
当我点击菜谱时 我可以看到制作这个菜谱 所需的所有配料 我可以点击 “说明” 按钮 来查看一步步的说明 当我点击“下一步”按钮时 我可以进入下一步 然而 当你准备饭菜时 有时不总是方便 点击屏幕上的按钮 因此 我希望我的 app 用户能够通过 使用 Siri 语音调用的快捷指令 进入下一个步骤 我将在我的 app 中 实现 app 内意图处理 因为我的用户将与屏幕上的内容交互
在 Xcode 中 我有我的意图定义文件 在那里我定义了我的自定义意图 称为“ShowDirections” 我还在菜谱指南视图中添加了 “添加到 Siri”(Add to Siri)按钮 这样用户就可以轻松地 在这里设置快捷指令 这是它在 app 中的样子
现在 回到 Xcode 我已经在我的 app 中 采用了多窗口支持 现在 我需要添加 ShowDirectionsIntent 到符合 app 内意图处理的 意图列表中 为此 我要点击“加号”(Plus)按钮 来添加我的意图
现在 我想让 app 中的 每个视图控制器 都能响应“下一步”(Next Step)命令
为此 我将定义 一个通用意图控制器 它接受一个符合 NextStepProviding 协议的对象
采用 NextStepProviding 协议的 视图控制器 需要返回一个 意向处理器类别的实例 它还需要实现 nextStep 函数 该函数将把用户带到 app 的下一步 让我们将意图控制器 与为我们生成代码的 showDirectionsIntentHandling 协议 相一致 并实现解析方法
在菜谱参数的解析方法中 我们将检查我们是否有菜谱 如果我们没有食谱 我们会要求消除歧义 否则 我们将返回成功 在处理方法中 我们将告诉下一步提供者 进入下一步 我们需要确保我们的 app 在前台 如果没有 我们会用 continueInApp 响应代码 启动 app 我们会需要在 SceneDelegate 中 处理用户活动的启动 稍后我会回到这个问题 现在 我将创建一个新的单例类别 它将持有 对当前意图控制器的弱引用
我们会把当前的意图处理器 分配到 app 中 每一个视图控制器的 viewDidAppear 里
在我的 app 委托中 我需要实现 新的 handlerForIntent: method 并返回当前的意图-控制器实例
在我的场景 - 委托对象中 我需要实现 willConnectToSession 和 continueUserActivity 方法 以便在处理方法中使用 continueInApp 响应代码 进行响应时继续用户活动 当 app 没有 UIScene 对象连接到它时 willConnectToSession 将被调用
现在 我们需要使每个视图控制器 符合 NextStepProviding 协议 最后 我们需要确保 在 viewDidAppear 中 分配当前意图处理器
让我们试一试
首先 我需要在 Siri 中添加快捷指令
现在 让我们看看体验如何 嘿 Siri 下一步
您想看哪种食谱? 辣番茄酱、鹰嘴豆咖喱 还是肉桂苹果蛋糕? 第一个 好的 正在查看 这些是做辣番茄酱的材料 嘿 Siri 下一步
好的 正在查看 第一步 在一个大锅里 中火加热橄榄油 嘿 Siri 下一步
好的 正在查看 第二步 加入蒜末 炒几秒钟直到炒出香味 很酷 不是吗?
在决定是在一个扩展程序 还是一个 app 中处理意图时 您应该先问问自己 这个任务能在扩展中完成吗? 因为如果是这样的话 这样做会更好 意图扩展可以更便捷 启动速度也更快 这取决于所连接的框架 和符号的数量 这是您优化启动时间的机会 因为您要决定 您的扩展要连接哪些框架 总结一下今天我们学到的 关于 app 内意图处理的知识
首先考虑实现一个意图扩展
一定要注意在 app 和扩展中 您连接了多少框架 app 内意图处理只支持多窗口 app 所以请务必从 WWDC 2019 中查看 “在 iPad 上的多窗口介绍” 和 “为多窗口设计您的 app” 我们非常期待看到你们 使用 app 内意图处理 构建的所有优秀的新 SiriKit 集成 现在 让我们看一下今年实现的 另一个 API 增强 我们称之为“丰富的消歧” 在 iOS 13 中 我们为 快捷指令引入了参数 允许您的用户在运行时 提供意图参数值 在解析您的意图的参数值时 您可以返回消除歧义的解析结果 用户将被提示从一个值列表中选择
今年 我们将为您的 app 引入 在这些列表中包含字幕和图片的功能
API 非常简单 您只需要在运行时为您的自定义类型 提供一个字符串形式的字幕 和一个 INImage 的图片
最酷的是 您还可以 在快捷指令 app 中 提供图片和字幕的动态选项 那么用户在配置您的意图时 就可以看到这些选项
消除歧义列表的另一个新功能 是 Siri 中的分页功能 作为一名开发者 现在您可以提供 Siri 马上应该告诉用户的项目数 以及提供随后由 Siri 介绍的内容 消除歧义分页只在 用户调用 Siri 时 说:“嘿 Siri ” 时使用 下面是如何用 Xcode 支持丰富的消歧 打开定义自定义意图的意图文件 并为需要自定义消歧分页的参数 展开 Siri 对话框部分 在这里 您可以简单地指定 可以马上告诉用户的最大项目数 以及随后的简介流 您也可以通过在意图编辑器中 指定您自己的对话框 来重写 Siri 在语音模式下 提供的消除歧义简介对话框 今年在 SiriKit API 中 增加的另一个功能是 动态选项的动态搜索
去年 我们引入了 一个动态 - 选项 API 当用户在快捷指令 app 中 配置您的意图时 它允许您动态地提供 一组符合条件的参数值 今年 我们扩展了这个 API 包括用户提供的搜索词
有一个新的复选框 可以在您 键入时提供搜索结果 如果选中该复选框 它将生成包含 searchTerm 的新方法 在用户键入时 此方法将重复被调用 如果搜索项为空 则可以向用户提供一个默认值列表 动态搜索应该只用于搜索大的目录 而不是过滤小的静态集合 因为快捷指令 app 默认支持过滤
提供选项集合方法完成处理程序 接受一个新的 INObjectCollection 对象 使用这个新对象 您现在可以将动态选项分组为 带有标题的部分 并可选择使用索引排序 在 iOS 13 中 我们为快捷指令引入了 可配置参数 您指定为面向用户的每个参数 都必须在运行时解析
现在 在 iOS 14 中 您可以将每个参数 分别标记为可配置和可解析 Siri 和快捷指令 app 不会解析 被标记为不可解析的参数 对于无法解析的参数 您不需要提供 Siri 对话框 今天 您学习了所有关于 app 内意图处理的知识 以及如何在您的 app 中 添加对它的支持 在 iOS 14 中 您可以使用 丰富的消歧功能 增强消歧列表和动态选项
动态搜索为您提供了 一种新的、灵活的方式 为您的意图参数提供动态选项
当您在设计意图时 要确定哪些参数在运行时 是可配置和可解析的 现在 让我们来看看一些有用的 技巧和窍门 它们可以帮助您将定制意图 提升到下一个层次 如果其中一个您的自定义意图 不再被需要 因为您停止了 app 中相应的功能 或者您用另一个意图 替换了这个意图 现在可以使用 Xcode 12 在 iOS 14 中 弃用自定义意图 在意图编辑器中 选择您想要弃用的意图 并通过单击工具栏中的 “Expand inspector”(展开检查器) 按钮来显示检查器
现在 您所需要做的就是 选中被弃用的复选框
在快捷指令 app 中 您的现有用户将看到这个意图操作 在您的 app 的未来版本中 可能不再可用 此外 这个意图操作 将从快捷指令操作列表中隐藏 现在 让我们讨论一下如何指定 定制 - 意图类名称 当您在意图编辑器中定义自定义意图 自定义类型或自定义枚举时 您定义的是类型名称 而不是实际的类别 实际的类别将根据类型名称 为您生成代码
因此如果您的 app 使用了类别前缀 这不是为您的自定义意图、类型和枚举 指定的正确位置
相反 在您的意图的自定义类别检查器中 提供您想要的类别名称 或者 您可以在需要进行代码生成的 目标的项目文档检查器中 为所有自定义意图、类型和枚举 指定一个公共类别前缀 这允许您在需要时 在不同的目标中 使用不同的类别前缀 在意图定义文件中 定义的一些自定义意图 可能需要用于确认和处理阶段的 意图 UI 视图 而其他的则不需要 让我们看看如何有效地管理它 当将意图定义文件 添加到意图 UI 扩展目标时 Xcode 会自动列出 这个意图 UI 扩展支持的 意图定义文件中的所有意图
但是 对于一些自定义意图 您可能根本不想显示任何用户界面
通过为 non-UI 意图 创建单独的意图定义文件 可以轻松实现这一点 然后 在意图定义文件的 目标成员检查器中 不要将其包含在 意图 UI 扩展目标中 有时 您可能想为您的自定义意图 明确地选择代码生成语言 您可以在项目的构建设置中 轻松完成此操作
默认情况下 Xcode 会根据 目标中包含的现有搜索文件 自动为符合条件的每个目标决定意图代码 生成语言 但是在这里 您可以选择定制此行为 今天我们讲了很多 我们介绍了今年 SiriKit API 中的 一些主要增强功能 我们还介绍了一些 在设计定制意图时 需要记住的最佳做法 非常感谢您的收看 我们迫不及待地想看到您的作品
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。