表1 send resolution result

2)ResolveContent
与接收者的处理类似,在这个方法中可以对Siri识别出的消息内容进行“修饰”,并且将resolution result反馈给Siri,比如QQ对一些消息里面的特殊词汇如“生气”做了emoji适配。
3)ConfirmSendMessage
这个方法的作用是确认是否要发送该消息,可以在这一步进行一些鉴权工作,鉴权通过后再确认发送,否则取消。确认可以发送后会调起确认发送界面,如图4所示。如果需要从Containing App共享数据,具体的实现方案参考App Group的Shared Container。
4)HandleSendMessage
如图4,当用户点击了“发送”按钮或者用语音给出了发送指令时会最终进入到这个方法,在这个方法里我们需要实现发消息的逻辑,发送成功后可以调起消息发送成功的界面,如图6。

图6 消息发送成功界面
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到来时再被唤醒。

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










