大多数浏览器和
Developer App 均支持流媒体播放。
-
SiriKit 媒体意图简介
iOS 13 改进了 SiriKit,推出了全新的音频内容播放支持。了解如何为音乐、电子读物、播客和广播等提供出色的免提播放体验。深入了解搜索词处理的最佳做法,并探索如何利用播放速度、添加至播放列表和允许客户告知您是否喜爱相应内容来提供全面的体验。
资源
相关视频
Tech Talks
WWDC20
-
下载
(关于SiriKit Media Intent的介绍)
嗨 我是Danny Mandel 欢迎参加关于 SiriKit Media Intent的介绍演讲
针对音频用例向SiriKit中 添加了媒体域支持 能与大家分享相关信息 我们感到非常激动
我们要讲哪些内容呢? 我们要做的第一件事就是介绍新的 SiriKit Media Intent 及其功能 (新SiriKit Media Intent 处理SiriKit Media请求) 然后讲在你的app上 处理SiriKit Media 请求都需要哪些东西
最后 讲一些最佳范例 你可以按照范例 尽可能地提供最佳用户体验 当向app中添加 SiriKit Media支持时
今年我们允许你们 以一种全新的方式来控制音频 通过SiriKit Media Intent 我们认为你们一定会喜欢 你通过SiriKit Media Intent 创建到app中的 Siri Media功能 你们可以实现比如播放音频、 更新品味介绍、添加到收藏 和搜索 这意味着 他们可以使用丰富的自然语言 来处理Siri功能 可以说比如“在我的app中 播放Khalid” 那会立即在你的app中 开始播放Khalid
(新SiriKit Media Intent) 让我们来看看新的 SiriKit Media Intent 及其功能
共有四个 SiriKit Media Intent
第一个Intent是 INPlayMediaIntent
INPlayMediaIntent 允许你通过说比如 “在我的app中播放 Outer Peace”播放音频 现在你可能记得 我们在iOS 12中发布了 Media Playback 的捷径 今年 我们把SiriKit功能添加到了 INPlayMediaIntent
下一个Intent是 INAddMediaIntent
INAddMediaIntent 允许人们向他们的播放列表 和曲库中添加媒体项
举个例子 “把这首歌添加到 我的app中的公路之旅播放列表”
我们有 INUpdateMediaAffinityIntent 允许人们表达对媒体项的亲密关系 人们可以通过说类似的 简单的语句表达这种观点 “我喜欢这首歌”
最后我们有 INSearchForMediaIntent 让人们搜索你的app中的 特定媒体项 比如“从我的app中 查找Billie Eilis”
我们谈谈SiriKit Media中 支持哪些媒体类型 SiriKit Media 支持许多不同的音频类型 第一个类型就是音乐 并且音乐支持… 你可以说比如 “在我的app中播放歌曲 ‘Awesome Song’”
除了歌曲 我们还支持专辑、歌手、 播放列表、流派等等 还有很多
那么你可以查看关于 INMediaSearch的文档 以获取所支持的 搜索媒体项的完整列表 并且我们希望你尽可能多地采用它们 从而在你的app中 提供最佳Siri用户体验
此外我们还有播放控制 比如随机播放、重复播放 和按顺序播放
人们可以说比如“请在我的app中 随机播放Khalid” 或“在我的app中下一首播放 Outer Peace”
所支持的下一个音频类型是播客
你可以通过说 “在我的app中播放播客 Stuff You Should Know” 开始播放播客 此外 人们还可以控制 播客的播放顺序和速度 人们可以说比如 “在我的app播客中播放 Stuff You Should Know 的最新一集” 或“在我的app播客中双倍速播放最新一集 的Stuff You Should Know”
(有声书) 接下来我们支持有声书 人们可以说比如 “在我的app中播放有声书 《Becoming》” 跟播客一样 以指定速度开始播放 当请求播放有声书时
最后我们支持收音机 收音机支持允许人们 在你的收音机播放app中 请求指定电台 比如“在我的app中 播放89.1 FM”
如果你app的媒体类型不含在 以上媒体类型之内 不要担心 你仍可以采用SiriKit Media Intent 及其全部功能
人们可以说比如 “在我的app中播放搜索条目” 你将可以在你的app中 查找搜索媒体项并播放它
漏掉的唯一一个功能 就是对强烈解析的媒体类型的支持 假如你有一个自然声音app 然后你说“在我的app中播放 爬行动物的叫声” 或“在我的app中播放 哺乳动物的叫声” Siri不知道那是两种 不同类型的动物叫声 因此你会获得一个哺乳动物叫声 或爬行动物叫声的字符串 你可以查找并播放它 因此不像其它类型那样有组织 但仍然支持
让我们看看如何在SiriKit中 处理这些Intent (Siri请求处理)
请求SiriKit Media 要了解的第一件事 就是SiriKit Media Intent 跟其它SiriKit域一样
因此发生在Intent app扩展中全部Intent处理 都遵守 SiriKit Media Intent处理协议
SiriKit请求处理的具体信息 在之前的WWDC演讲中已具体讲过 我推荐你回顾那些演讲 以及查看在线的开发者文档 获取更多关于SiriKit 请求处理的信息
现在让我们看看 SiriKit Media域中的 典型请求会发生什么?
当人们说“在我的app中 播放酷歌”时 就开始请求处理 并且Siri会识别 这是一个针对app的请求 它会启动Intent扩展 SiriKit请求处理 需要三个步骤: Resolve、 Confirm和Handle
请求处理的第一个步骤是 Resolve 在媒体域中 Resolve步骤是获取Intent的 INMediaSearch对象 并在app的目录中进行搜索
Resolve的输出是要播放的 一个或多个具体的媒体项对象
否则如果我们没有找到匹配项 或发生了另一个报错 我们会返回一个 Unsupported结果 那会告诉Siri播放 恰当的报错对话
请求处理的下一步是 Confirm步骤
一般我们不鼓励 在媒体域中使用Confirm步骤 通过查看在我们自己的 app中的使用 我们发现使用Confirm 实际上会降低 人们继续播放媒体的可能性 因此我们不推荐 在媒体域中使用Confirm步骤
请求处理的最后一个步骤是 Handle 对于INPlayMediaIntent 这一步非常简单 因为我们会返回响应代码 “handle an app” 会在后台启动app
在app后台启动过程中 我们会像通常在app中所做的那样 播放媒体
唯一棘手的部分就是测试 你要确保全部都会播放 因为屏幕上没有任何UI 你还要确保 针对各种情况都进行了测试 比如在CarPlay车载中 或当你戴着耳机时 那么现在我们了解了 关于SiriKit请求处理的 大概信息 让我们看一个简化了的 Resolve媒体项方法
需要注意的第一件事就是 参数稍微有点不一样 但Resolve逻辑一样 全部四个Media Intent 的逻辑都一样 Resolve的工作是 搜索app目录 全部四个Intent的 实现方式都一样
因此我们要把一个结果初始化为 一个Unsupported的结果 那会告诉Siri说出恰当的 报错对话 如果我们没有在app目录中 找到任何东西的话
INMediaSearch 是一个Intent字段 包含关于用户 请求播放什么内容的详细信息 INMediaSearch 表示Siri所支持的 全部音频相关的查询 我们在Resolve步骤中的工作 是从全部可能性中 找到单一媒体项并播放 在这个例子中 我们要做的第一件事就是 从INMediaSearch中读取媒体名称
然后要从app目录中 取回媒体项的列表
我们要在媒体搜索中 使用媒体名称属性 从而与媒体项的名称属性进行对比 我们稍后再具体谈这个 但在你已发布的app中 这并不是你真正想要去做的
但如果我们实现了精确的名称匹配 我们找到了要播放的媒体项 我们会使用那个媒体项的属性 创建一个成功结果
然后调用完成处理器并继续处理
在这种情况下 正如我们所说过的 处理过程非常短 因为我们所要做的只是返回 handleInApp成功响应代码 这将会开始在后台启动我们的app 现在让我们来看看app的后台启动
我们在app委托中实施的 用于支持后台app启动的方法 就是application:handle: completionHandler:
再一次 这是一个过程很短的实施
我们要从intent中 读取要播放的第一个媒体项
然后我们只需要像通常那样 在app中播放它即可
最后我们会调用完成处理器 返回成功响应代码
现在我们已经了解了新Intent 以及它们是如何共同起作用的 我要把舞台交给 Ryan Klems 他将在实际的app中 为我们进行演示
谢谢Danny
向当前Media app中添加 SiriKit Media Intent 处理非常简单 这是我们的音乐app 要添加Siri支持 我们所要做的就是 添加Siri扩展目标 添加一些方法 然后 我们将立即处理Siri请求
要添加Intent的扩展 我们所要做的就是打开File New Target…
选择Intent Extension 并点击下一步 给它命名…
然后点击完成
Xcode将为我们创建 Intent处理器 我们要继续并向app中 添加Siri支持
然后打开 Control Extension 并且添加我们所支持的Intent 在这个例子中 我们将支持 INPlayMediaIntent
和INAddMediaIntent
我们继续并选择音乐类型
在这里有一些 我们想要添加的方法 从而确保文件加入编译过程
我们要确保打开适当的代码签名
现在我们将转向Intent处理器 我们所要做的就是添加 对INPlayMediaIntent处理协议的支持
然后我们要为Resolve
和Handle方法加入一些存根
在这个例子中 我们只需要从 Resolve媒体项中 返回Unsupported 支持的结果即可 那将导致Siri说 它没有找到搜索项 那么我们要继续并尝试运行一下 这正是我们想要的结果
那么Siri说了 它没有找到搜索项…
由于我们从Intent处理器中 返回了Unsupported…
那么我们现在要做的就是继续并… 把这个挂钩到现有的搜索实施上
在这种情况下 我们要做的第一件事 就是决定用户正在搜索什么 在这个简单的例子中 我们要搜索一位歌手
在方法中 我们继续并Resolve
媒体项
一旦我们Resolve媒体项 然后我们将返回到Handle方法
并返回handleInApp方法 响应代码 那将导致在后台启动app 为此 我们要切换到app委托中 添加 Handle Intent方法 这将提取我们所传递的 INMediaItem 我们在上一个步骤中找到了它 并把它传递给播放 我们要继续并播放 看看那看起来怎么样
那么你可以看到 我们返回了INMediaItem 它找到了INMediaItem 并把它传回给app 然后开始播放 那么现在我们已经完成了 我们为什么不继续 并给添加方法添加支持呢?
为此 我们只需要对它进行扩展 通过添加…
INAddMediaIntent 处理协议
然后我们要添加用于查找 和处理添加方法的方法 你可能在这里注意到 用于添加的Resolve媒体项 和用于播放的Resolve方法 看起来非常相似
此外 对于添加 我们还有一个 Resolve Media Destination 它用于决定用户是否 尝试添加到媒体库或添加到播放列表
如果是添加到播放列表 你可能想要实现 比如“返回未找到的播放列表名称” 如果用户指定的播放列表 在他们的媒体库中不存在的话
同时 对于添加的不同之处在于 没有理由返回到app比如开始播放 就像我们在Play Media Intent中 所做的那样 在这种情况下 我们要做的就是 在扩展中处理一切 我们有找到的媒体项 我们只需要继续并使用app方法 添加到媒体库或播放列表 在这种情况下 我们只需要使用 媒体播放器工具来添加它即可 那么让我们继续并查看 那看起来怎么样
因此它与添加到播放列表中的媒体项 以及播放列表名称通讯 因为那些是在请求中指定的
正如你所看到的 向app中添加支持相对简单 我们非常想看到你们 在你们的app中会实现什么效果 谢谢
Danny 舞台交还给你
谢谢Ryan 那么Ryan给我们演示了什么? 首先他演示了如何向app中 添加Intent扩展 然后他演示了如何指定 所支持的Intent 及所支持的媒体类型 最后他演示了如何对 INPlayMediaIntent 和INAddMediaIntent 实施Resolve和Handle 我们可以立即开始使用Siri 播放和添加媒体了 (演示总结) (最佳实践) 让我们看一些最佳范例 你可以在采用SiriKit Media时 进行参考 (添加SiriKit支持捷径) 如果你已经为媒体播放 实施了捷径 我们有个好消息 对于后台启动app来说 SiriKit Media使用的 是同样的代码和处理方式
运行在之前添加的 Intent上的捷径 不要求Intent分辨率 而SiriKit的确要求有 Resolve步骤 因此你需要添加的两个东西是… Resolve方法 和Intent处理器 并且你需要在Xcode中更新 所支持的媒体类型的 Intent扩展 从而Siri就了解你的app 支持哪种内容类型
Extensions Handle 方法应该是一样的 在两个实施和后台启动app之间 app委托的 Handle Intent可相同 只要你为媒体项使用了同样的标识符
让我们看看那看起来怎么样 这是去年的捷径实施 你要注意没有Resolve方法 但其余都一样 为了从捷径打开SiriKit
我们只需要添加Resolve方法 然后就可以了 (Siri请求处理)
现在让我们谈谈如何 向Apple Watch 引入SiriKit媒体支持
在watchOS上 app在前台启动 实现方式是在Intent的扩展中 从Handle方法中 返回INPlayMediaIntent响应代码 continueInApp
这个代码将在前台启动app 并在app中把Intent转给 WKExtension委托
你要注意app的Handle方法 看起来与iOS上的 那个方法非常相似 Signature方法有点不一样 但你需要从 NSUser Activities Interaction属性中 读取Intent 然后跟iOS上一样 读取要播放的媒体项 并开始在app中播放
有一个警告 你要在watchOS上的 Resolve方法中 使用设备上的缓存 仅通过网络 如果绝对必要的话
因此我们知道当某人说 “在我的app中播放 Awesome Song” 时 请求处理的第一个步骤 是查找要播放的媒体项
我们查看了一个以前的实施 我们核对了媒体项的名称的值 和Intent的媒体名称属性
完全匹配 那么在那个实施中我们还没有考虑到 哪些极端情况呢?
第一个是我们之前的方法 没有做正确的事 如果存在错配或标点符号 那么在这个例子中 “在我的app中 播放‘hello’” 我们可以看到一些 字符串精确对比失败的例子
准确的歌曲标题是 大写的HELLO加叹号 Siri语音引擎不可能 给我们提供小写的hello 或也许它给我们提供了一个 大写的HELLO但不带叹号 因此在Resolve方法中 忽略大小写和标点符号非常重要
(在Resolve中 写一个有效的搜索方法) 类似地 许多音乐实体 标题中有人们要么不表达 要么以一种不能与媒体项的标题 精确匹配的方式表达的内容 比如许多专辑发布了精装版 当人们请求播放专辑时 人们不会提到这个
他们不会说 “在我的app中播放专辑 Outer Peace的精装版” 而是会说“在我的app中播放专辑 《Outer Peace》”
而电影原声是另一个例子
人们不会说— 人们会说 “在我的app中播放 Rocket Man电影原声” 但他们不会说“来自电影的音乐”
最后许多嘻哈音乐的标题中 都有缩写 因此人们要么不说 要么说“特色” 因此这里不适用精确匹配
并且播客也有一些情况 人们所说的内容与实体标题 所包含的内容不匹配
有些播客在标题中包含 “播客”这个词 因此如果某人说 “在我的app播客中播放 Stuff You Should Know” Siri会在播客的媒体项类型中解析 Stuff You Should Know 因此这里也不适用精确匹配
此外 有些播客既有音频又有视频 并且标题中出现了 音频或视频这两个词 但SiriKit Media 暗指音频 因此人们也不会那样说
最后请记住 你正在做的是语音识别器 并且语音识别器 可能会有文字格式变化 如果有人要求播放歌曲81st 你会得到数字81st或文字八十一
或如果某人要求播放歌曲 “I Love You Son” 你会得到sun或son
现在Siri会尽最大努力 为你提供它所了解的实体标题 但…最好是在Resolve方法中 应用一些弹性搜索
当你实施 SiriKit Media支持时 你通过从Resolve方法中 返回的INMediaItem对象 控制Siri说什么
你可以从这里看到 用户请求 在Control Audio中 播放Special Disaster Team的歌曲 “Maybe Sometime” 而Siri说 “这是Special Disaster Team的 ‘Maybe Sometime’ 来自Control Audio”
在这种情况下 所返回的 INMediaItem 有一个标题属性是 “Maybe Sometime” 歌手属性是 Special Disaster Team
因此一定要在所返回的媒体项中 填充标题、歌手和类型 因为这些都会对Siri所说的内容 产生影响
有一件事要注意 如果你在Resolve方法中 返回一个以上的媒体项 Siri会指向列表中的第一项
在SiriKit Media中 恰当地处理报错 非常重要 当你与一个聪明的助手比如Siri 进行交互时 当某些事情发生时 不清楚它为什么会发生 并且恰当地处理报错 会让用户了解发生了什么 当出错时 (错误) 你最经常遇到的情况是 从app目录中找不到 用户所请求的内容 你可以通过从Resolve 媒体项中返回 Unsupported Resolution 结果来处理这种情况 但还可能发生许多其它错误 也许有人请求播放 需要蜂窝数据的内容 但却关闭了你app中的蜂窝数据
或也许他们要求播放需要订阅的内容 但他们却没有订阅
INPlayMediaMediaItem UnsupportedReason中有完整列表 并且对全部四个Intent的命名 都大体相似 因此要在你支持的 全部Intent中采用它们 现在让我们谈谈 人们对Siri说的一些不同的内容 以及如何 在SiriKit Media 实施中处理它们 (人们可能会对Siri说的内容)
人们最可能对Siri说 的内容之一就是 “播放我的app” 他们不会告诉你具体要播放什么
那是你作为SiriKit Media 开发人员的工作 你要选择做正确的事
这变得和恢复现有排序一样简单了 如果不是有声书或播客app 这很可能是最合理的行为
但你可以尽可能地 把行为变得更动态化 也许你想把他们指向推荐播放列表 或一些很火的新热门音乐 选择权在你 如何知道某人说了 “播放我的app”呢 在INMediaSearch 对象中没有指定的搜索条件 有一件事听起来像是个好主意 就是询问用户要播放什么内容 但是与不推荐使用 Confirm的原因相同 我们不推荐这种方案 在用户面前弹出对话框 是他们退出SiriKit Media 体验的最常见的理由
用户可以使用额外控制 对播放进行初始化 并且其中所支持的选项有重复播放、 随机播放、恢复播放 和按顺序播放 如果你的app支持这些功能 请一定在 INPlayMediaIntent实施中 也支持它们
人们还会请求播放 有多个搜索选项的内容 最有用的搜索选项之一 是Sort参数 你可以说比如 “在我的app播客中播放新一集的 Stuff You Should Know” 然后你会得到最新的 INMediaSortOrder 或你可以按歌手请求最佳专辑 你将得到最佳的 INMediaSortOrder 或你可以要求app推荐 你将得到推荐的 INMediaSortOrder 请从INMediaSortOrder中 查看完整列表
另一个强大的搜索选项是 Reference属性 它包含INMediaReferenceCurrently 播放
这对于INAddMediaIntent 或INUpdateMediaIntent非常有用 因为人们可以轻松地向媒体库 或播放列表中 添加当前播放的媒体项 或者他们会告诉app他们喜欢 或讨厌当前所播放的媒体项
还有一件事要注意 如果你在 MPNowPlayingInfo中心 填充了外部内容识别器 那个识别器将出现在 INMediaSearch的识别器属性中 因此你就能了解具体要找哪个媒体项
现在告诉Siri更多关于 客户如何使用你的app的信息 会帮助Siri提供极好的 SiriKit Media体验 (告诉Siri有关客户的信息) (词汇表)
当你给Siri提供用户词汇表时 这会帮助Siri了解你的部分目录 对客户有吸引力 有一点需要留意 非常重要 它不是app目录的完整内容 它只是你的客户 特别感兴趣的部分内容
还有一件非常重要的事要注意 词汇表是按顺序排列的 因此一定要在词汇表的开端 包含最重要的词
并根据app所支持的媒体类型 向Siri发送不同的类型
音乐app应该使用 播放列表标题和歌手名字 有声书app应该使用 有声书标题和作者 而播客app应该使用显示标题
对于那些适用于全部用户的功能 请查看SiriKit中的 全球词汇支持
(总结) 总的来说 我们发布了新的 SiriKit Media Intent 允许你使用Siri 控制你的音频app 你将可以播放、添加、 更新品味介绍 并使用新Intent搜索媒体项 尽可能地提供最佳体验非常重要 你可以通过弹性搜索来实现 但人们并不会表明 他们具体要播放什么
你可以恰当地处理错误 从而当发生错误时 用户会了解发生了什么
并且你一定要 恰当地构建 INMediaItem对象 从而使尽可能地 让Siri说出最佳对话
最后一定要尽可能地给Siri 提供重要的情境信息 从而使Siri以客户名义 作出最佳选择
请参加我们的讨论会 并查看在线文档 我们认为你们一定会喜欢 用新SiriKit Media Intent 来创建app 并且我们已经迫不及待地 想看到你们会创建什么了 谢谢 (欲知更多信息 请登录 DEVELOPER.APPLE.COM/WWDC19/207)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。