你 App 的Indents extension扩展的接口点是INExtension Object,它的主要作用是把indents引导给Siri去处理。
在extension里有三类objects来处理intents
一种Indents Object保存Siri收集的用户数据
一种Handler Object是你自定义的用以解析,确定并处理indents
一种Response object保存你的处理结果
当SiriKit有一个Indent需要处理时,它会请求INExtension寻找一个匹配的Handler,Handler都继承了相应的Protocol协议对应不同种类的indents。
这些Protocols都有相似的结构,有相应的方法解析,确认并处理相应等indent
实现一个handler必须实现相对应处理所配indents的方法,其他方法都为可选方法,利用这些方法优先解析和确认indents,再进行处理。
在进行验证过程中,Siri和用户进行交互获取额外需要的信息
下图为Siri和handler的流程图
向Handler Objects派发Intents
当intent被app接收,SiriKit请求Intents extension提供相应的handler object,SiriKit调用INExtension子类的 handlerForIntent: 方法,这就是你extension的接入点。
这个方法会返回SiriKit解析,确认和处理的Objects
下面代码块显示实现了 handlerForIntent: 方法提供的针对文本信息和VoIP(语音协议)的intents的handler objects。 这个结构同样可以用于其他的不同handler。
你先检查发过来的intent的类并返回相应的handler object。 你可以利用单一handler来处理所有你支持的intents或者创建分别不同的handler针对不同的intent。
下面例子,intents extension为所有文本相关的intents返回同一个handler object,为语音和视频intents返回不同的handler
</pre><pre name="code" class="plain">
-
overridefunchandler(forintent:INIntent) -> AnyObject? {
-
varhandler = nil
-
-
ifintentisINSendMessageIntent ||
-
intentisINSearchForMessagesIntent ||
-
intentisINSetMessageAttributeIntent {
-
handler = MyMessageHandler()
-
}
-
elseifintentisINStartAudioCallIntent {
-
handler = MyAudioCallHandler()
-
}
-
elseifintentisINStartVideoCallIntent {
-
handler = MyVideoCallHandler()