图3 Intent Extentsion info.plist配置
SiriKit的接入主要分为Intents Extension和Intents UI Extension两部分,下面分别进行介绍。
Intents Extension
当我们对siri说“用QQ发消息给王一然说你好”时,语音的识别将会由Siri自动完成,Siri会将识别好的内容展示在Siri的界面。如图4所示,我们可以看到一个完整的发消息语句主要由四部分组成:
应用名:告诉Siri要使用哪个App,siri会根据app的bundle displayname自动识别app的名称,无需额外注册。
发消息Intent:告诉Siri要使用发消息的功能,我们实测发现说发信息也是能识别,具体还有哪些词汇会识别为发消息的intent苹果没有在文档中说明。
消息接收者:告诉siri消息的接收者是谁,“王一然”是我QQ好友的昵称。
消息内容:告诉Siri你要发的消息内容是什么,这里的消息内容为“我很生气”。

图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:

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










