iOS 10 SiriKit QQ 适配详解

澳门新葡亰平台官网 11

1. 概述

苹果在 iOS 10 开放了 SiriKit 接口给第三方应用。目前,QQ 已经率先适配了
Siri 的发消息和打电话功能。这意味着在 iOS 10 中你可以直接告诉 Siri
让它帮你发 QQ 消息和打 QQ 电话了,听起来是不是很酷炫?

那么第三方应用使用 Siri 的体验究竟如何?哪些应用可以接入 SiriKit?接入
SiriKit 又需要做哪些工作呢?这篇文章会为你一一解答这些疑惑。

澳门新葡亰平台官网 1

图1 用 Siri 发 QQ 消息效果展示

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:

2. SiriKit 简介

我们都知道 Siri 是 iPhone 手机中的智能语音助手,那么什么是 SiriKit
呢?SiriKit 是苹果为第三方应用支持 Siri
提供的开发框架。在官方文档中,SiriKit 将对不同场景的语音支持划分为不同的
domain,目前,SiriKit 支持的 domain 包括:VoIP 电话、发消息、转账、图片搜索、网约车订车、CarPlay
和餐厅预定,也就是说如果你的应用中包含有这些功能之一,就可以考虑将这些功能接入到
SiriKit 中啦。

实现 SiriKit
相关功能时,我们并不需要真正对语音进行识别,语音的识别工作会由 Siri
完成。Siri 识别完语音后,会将语音要完成的功能抽象成 Intent
对象传递给我们,而我们的接入工作主要是与这些 Intent
对象打交道,并不会涉及到自然语言处理(NLP)的技术。

关于 SiriKit 的开发网上已有一些文章(比如《SiriKit 初探 —— WWDC 2016
技术赏析》),也可参考苹果的官方文档 SiriKit
Programming
Guide,本文着重介绍
QQ 的适配经验。

澳门新葡亰平台官网 2

图2 SiriKit 原理

1. 概述

苹果在iOS10开放了siriKit接口给第三方应用。目前,QQ已经率先适配了Siri的发消息和打电话功能。这意味着在iOS10中你可以直接告诉Siri让它帮你发QQ消息和打QQ电话了,听起来是不是很酷炫?

那么第三方应用使用Siri的体验究竟如何?哪些应用可以接入SiriKit?接入SiriKit又需要做哪些工作呢?这篇文章会为你一一解答这些疑惑。

澳门新葡亰平台官网 3

图1 用Siri发QQ消息效果展示

3. SiriKit 接入

要实现 SiriKit 的功能需要在 Xcode 工程中添加 Intents Extension 的
target,和其他 extension 一样,Intents Extension 是一个独立于 Containing
App 进程运行的插件,主要用于处理和确认来自 Siri 的 intent 请求。如果想让
Siri 在处理 App 相关 intent 时提供一些自定义的界面,那么你就需要再添加
Intents UI Extension 的 target,Intents UI Extension
也是一个独立运行的插件(所以要完整的支持 SiriKit 其实是需要添加两个
target,有点蛋疼)。关于 App Extension 的开发可以参考苹果的 App
Extension Programming
Guide。

我们以 QQ 中的发消息功能为例说明一下 SiriKit 的接入方法:

首先,我们需要在 Intents Extentsion 的 info.plist 文件中配置须支持的
Siri Intents,在 IntentsSupported 中加入
INSendMessageIntent,如果需要在锁屏时禁用某个功能,则再在
IntentsRestrictedWhileLocked 中加入相应项的 Intent,如图3所示。

澳门新葡亰平台官网 4

图3 Intent Extentsion info.plist 配置

SiriKit 的接入主要分为 Intents Extension 和 Intents UI Extension
两部分,下面分别进行介绍。

2. SiriKit简介

我们都知道Siri是iphone手机中的智能语音助手,那么什么是SiriKit呢?SiriKit是苹果为第三方应用支持Siri提供的开发框架。在官方文档中,SiriKit将对不同场景的语音支持划分为不同的domain,目前,SiriKit支持的domain包括:VoIP电话、发消息、转账、图片搜索、网约车订车、CarPlay和餐厅预定,也就是说如果你的应用中包含有这些功能之一,就可以考虑将这些功能接入到SiriKit中啦。

实现SiriKit相关功能时,我们并不需要真正对语音进行识别,语音的识别工作会由Siri完成。Siri识别完语音后,会将语音要完成的功能抽象成Intent对象传递给我们,而我们的接入工作主要是与这些Intent对象打交道,并不会涉及到自然语言处理(NLP)的技术。

澳门新葡亰平台官网 ,关于SiriKit的开发网上已有一些文章,也可参考苹果的官方文档SiriKit
Programming Guide,本文着重介绍QQ的适配经验。

澳门新葡亰平台官网 5

图2 SiriKit原理

Intents Extension

当我们对 Siri 说“用 QQ 发消息给王一然说你好”时,语音的识别将会由 Siri
自动完成,Siri 会将识别好的内容展示在 Siri
的界面。如图4所示,我们可以看到一个完整的发消息语句主要由四部分组成:

  1. 应用名:告诉 Siri 要使用哪个 App,Siri 会根据 App 的 bundle
    displayname 自动识别 App 的名称,无需额外注册。
  2. 发消息 Intent:告诉 Siri
    要使用发消息的功能,我们实测发现说发信息也是能识别,具体还有哪些词汇会识别为发消息的
    intent 苹果没有在文档中说明。
  3. 消息接收者:告诉 Siri 消息的接收者是谁,“王一然”是我 QQ 好友的昵称。
  4. 消息内容:告诉 Siri
    你要发的消息内容是什么,这里的消息内容为“我很生气”。

澳门新葡亰平台官网 6

图4 确认发送消息界面

其中应用名和 Intent 是必须的,不然 Siri
无法抽象出你的“Intent”。后两项如果缺省的话,我们可以在实现中要求用户进一步提供数据或者忽略。在识别完成后
Siri 会将消息内容和接收者抽象成一个 INSendMessageIntent 传递给 QQ 的
Intent Extension。

我们从图4还可以看到 Siri 准确从我的语音中识别出我 QQ
好友中昵称为“王一然”的好友,然而“王一然”并不是一个通用的短语,那么这是怎么做到的呢?奥秘就在于在
QQ 运行时我们把所有 QQ 好友的昵称同步到了 Siri 云端,这样 Siri
就可以识别出特定用户要使用的特定短语,详细同步方法可参考 INVocabulary
setVocabularyStrings:ofType:方法。

每个 domain 的功能在 Siri 中都有对应的 Intents,而每个 intents
都对应一个特定的 handler 协议。对于发消息来讲,对应的 Intent 和 handler
协议分别为INSendMessageIntentINSendMessageIntentHandling。只要实现INSendMessageIntentHandling协议中的相关方法,并在
Siri
解析出INSendMessageIntent请求时用我们的INSendMessageIntentHandling对象去处理相关的发消息请求。具体的流程如图5:

澳门新葡亰平台官网 7

图5 Siri 发 QQ 消息流程

1)ResolveRecipientsForSendMessage

对 Siri
从Intent中传递过来的接收者名称进行处理和确认,比如可以确认该名称当前是否在
QQ 好友列表中,并将 resolution result 反馈给 Siri。Resolution result
代表了应用对 intent 处理后的结果,对于发消息来说,表1列举了几种可能的
resolution results。

表1 send resolution result

澳门新葡亰平台官网 8

2)ResolveContent

与接收者的处理类似,在这个方法中可以对 Siri
识别出的消息内容进行“修饰”,并且将 resolution result 反馈给 Siri,比如
QQ 对一些消息里面的特殊词汇如“生气”做了 emoji 适配。

3)ConfirmSendMessage

这个方法的作用是确认是否要发送该消息,可以在这一步进行一些鉴权工作,鉴权通过后再确认发送,否则取消。确认可以发送后会调起确认发送界面,如图4所示。如果需要从Containing
App共享数据,具体的实现方案参考 App Group 的 Shared Container。

4)HandleSendMessage

如图4,当用户点击了“发送”按钮或者用语音给出了发送指令时会最终进入到这个方法,在这个方法里我们需要实现发消息的逻辑,发送成功后可以调起消息发送成功的界面,如图6。

澳门新葡亰平台官网 9

图6 消息发送成功界面

3. SiriKit接入

要实现SiriKit的功能需要在Xcode工程中添加Intents
Extension的target,和其他extension一样, Intents
Extension是一个独立于Containing
App进程运行的插件,主要用于处理和确认来自siri的intent请求。如果想让Siri在处理App相关intent时提供一些自定义的界面,那么你就需要再添加Intents
UI Extension的target,Intents UI
Extension也是一个独立运行的插件(所以要完整的支持SiriKit其实是需要添加两个target,有点蛋疼)。关于App
Extension的开发可以参考苹果的App Extension Programming Guide。

我们以QQ中的发消息功能为例说明一下SiriKit的接入方法:

首先,我们需要在Intents
Extentsion的info.plist文件中配置我们需要支持的siri
Intents,在IntentsSupported中加入INSendMessageIntent,如果需要在锁屏时禁用某个功能,则再在IntentsRestrictedWhileLocked中加入相应项的Intent,如图3所示。

澳门新葡亰平台官网 10

图3 Intent Extentsion info.plist配置

SiriKit的接入主要分为Intents Extension和Intents UI
Extension两部分,下面分别进行介绍。

Intents UI Extension

对于支持自定义界面的 Intent 类型,可以在 Intents UI Extension
中提供更美观的自定义界面。 Custom UI 的实现相对较简单,和 iOS App
的开发一样,都是通过 UIViewController 的子类实现。我们需要在 Intents UI
Extension 的 info.plist 文件中设置 initial viewcontroller 或者设置 main
storyboard,对于不同类型的 Intent 的界面展示,通过 Child Viewcontrollers
的方式实现差异化界面展示。

如图7所示,当接收到来自 Intents Extension 的 response 时,系统会唤起
Intents UI Extension 并加载 initial
viewcontroller,通过INUIHostedViewSiriProviding协议的configureWithInteraction:context:completion:方法可以获取
intent,比如在发消息功能中,在消息确认发送和发送成功后都会回调一次这个方法。根据
Intent 对象的类型和状态,在收到相关 Intent 的回调时 present 对应的 Child
Viewcontroller 即可实现定制化的界面展示。

这里需要注意的是,Intents UI Extension
的进程并不会在界面销毁后就退出,很可能只是在后台处于休眠状态,下次
response 到来时再被唤醒。

澳门新葡亰平台官网 11

图7 Life cycle of an Intents UI extension

Intents Extension

当我们对siri说“用QQ发消息给王一然说你好”时,语音的识别将会由Siri自动完成,Siri会将识别好的内容展示在Siri的界面。如图4所示,我们可以看到一个完整的发消息语句主要由四部分组成:

应用名:告诉Siri要使用哪个App,siri会根据app的bundle
displayname自动识别app的名称,无需额外注册。

发消息Intent:告诉Siri要使用发消息的功能,我们实测发现说发信息也是能识别,具体还有哪些词汇会识别为发消息的intent苹果没有在文档中说明。

消息接收者:告诉siri消息的接收者是谁,“王一然”是我QQ好友的昵称。

消息内容:告诉Siri你要发的消息内容是什么,这里的消息内容为“我很生气”。

澳门新葡亰平台官网 12

图4 确认发送消息界面

其中应用名和Intent是必须的,不然Siri无法抽象出你的“Intent”。后两项如果缺省的话,我们可以在实现中要求用户进一步提供数据或者忽略。在识别完成后Siri会将消息内容和接收者抽象成一个INSendMessageIntent传递给
QQ的Intent Extension。

我们从图4还可以看到Siri准确从我的语音中识别出我QQ好友中昵称为“王一然”的好友,然而“王一然”并不是一个通用的短语,那么这是怎么做到的呢?奥秘就在于在QQ运行时我们把所有QQ好友的昵称同步到了Siri云端,这样Siri就可以识别出特定用户要使用的特定短语,详细同步方法可参考INVocabulary的setVocabularyStrings:ofType:方法。

每个domain的功能在Siri中都有对应的Intents,而每个intents都对应一个特定的handler协议。对于发消息来讲,对应的Intent和handler协议分别为INSendMessageIntent和INSendMessageIntentHandling。只要实现INSendMessageIntentHandling协议中的相关方法,并在Siri解析出INSendMessageIntent请求时用我们的INSendMessageIntentHandling对象去处理相关的发消息请求。具体的流程如图5:

澳门新葡亰平台官网 13

图5 Siri发QQ消息流程

1)ResolveRecipientsForSendMessage

对siri从Intent中传递过来的接收者名称进行处理和确认,比如可以确认该名称当前是否在QQ好友列表中,并将resolution
result反馈给Siri。Resolution
result代表了应用对intent处理后的结果,对于发消息来说,表1列举了几种可能的resolution
results。

表1 send resolution result

澳门新葡亰平台官网 14

2)ResolveContent

与接收者的处理类似,在这个方法中可以对Siri识别出的消息内容进行“修饰”,并且将resolution
result反馈给Siri,比如QQ对一些消息里面的特殊词汇如“生气”做了emoji适配。

3)ConfirmSendMessage

这个方法的作用是确认是否要发送该消息,可以在这一步进行一些鉴权工作,鉴权通过后再确认发送,否则取消。确认可以发送后会调起确认发送界面,如图4所示。如果需要从Containing
App共享数据,具体的实现方案参考App Group的Shared Container。

4)HandleSendMessage

如图4,当用户点击了“发送”按钮或者用语音给出了发送指令时会最终进入到这个方法,在这个方法里我们需要实现发消息的逻辑,发送成功后可以调起消息发送成功的界面,如图6。

澳门新葡亰平台官网 15

图6 消息发送成功界面

4. 总结

总的来说虽然苹果这一次对 SiriKit
开放的场景有限,但是从我们的适配经历来看苹果对 Siri
还是非常重视的。另外,这是 SiriKit
首次对第三方应用开放接口,所以不可避免存在一些问题。我们在开发过程中也确实遇到了一些
SiriKit 本身的 Bug,大部分 Bug
在向苹果反馈后都得到了解决,但是在语言识别方面 Siri
依然存在一些缺陷,比如对中英文混合的场景识别依旧不太好。期待以后 Siri
对中文的支持越来越好,也希望 Siri 能够开放更多的场景给第三方应用适配。

Intents UI Extension

对于支持自定义界面的Intent类型,可以在Intents UI
Extension中提供更美观的自定义界面。 Custom UI的实现相对较简单,和ios
app的开发一样,都是通过UIViewController的子类实现。我们需要在Intents UI
Extension的info.plist文件中设置initial viewcontroller或者设置main
storyboard,对于不同类型的Intent的界面展示通过Child
Viewcontrollers的方式实现差异化界面展示。

如图7所示,当接收到来自Intents Extension的response时,系统会唤起Intents
UI Extension并加载initial
viewcontroller,通过INUIHostedViewSiriProviding协议的configureWithInteraction:context:completion:方法可以获取intent,比如在发消息功能中,在消息确认发送和发送成功后都会回调一次这个方法。根据Intent对象的类型和状态,在收到相关Intent的回调时present对应的Child
Viewcontroller即可实现定制化的界面展示。

这里需要注意的是,Intents UI
Extension的进程并不会在界面销毁后就退出,很可能只是在后台处于休眠状态,下次response到来时再被唤醒。

澳门新葡亰平台官网 16

图7 Life cycle of an Intents UI extension

4. 总结

总的来说虽然苹果这一次对SiriKit开放的场景有限,但是从我们的适配经历来看苹果对Siri还是非常重视的。另外,这是SiriKit首次对第三方应用开放接口,所以不可避免存在一些问题。我们在开发过程中也确实遇到了一些SiriKit本身的Bug,大部分bug在向苹果反馈后都得到了解决,但是在语言识别方面Siri依然存在一些缺陷,比如对中英文混合的场景识别依旧不太好。期待以后Siri对中文的支持越来越好,也希望Siri能够开放更多的场景给第三方应用适配。

更多精彩内容欢迎关注bugly的微信公众账号:

澳门新葡亰平台官网 17

腾讯
Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条
Crash
根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的
iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图