iOS开发-SiriKit应用

493 查看

 

关于SiriKit

在6月14日凌晨的WWDC2016大会上,苹果提出iOS10是一次里程碑并且推出了十个新特性,大部分的特性是基于iPhone自身的原生应用的更新,具体的特性笔者不在这里再次叙述,请看客们移步WWDC2016下载自行观赏。要说里程碑在笔者看来有些夸大其实了,不过新增的通知中心联动3D Touch确实为人机交互带来新的发展,另外一个最大的亮点在于Siri的接口开放。在iOS10中提供了SiriKit框架在用户使用Siri的时候会生成INExtension对象来告知我们的应用,通过实现方法来让Siri获取应用想要展示给用户的内容

Siri服务

iOS10之后,苹果希望Siri能够给用户带来更多的功能体验,基于这个出发点,新增了SiriKit框架。Siri通过语言处理系统对用户发出的对话请求进行解析之后生成一个用来描述对话内容的Intents事件,然后通过SiriKit框架分发给集成框架的应用程序以此来获取应用的内容,比如完成类似通过文字匹配查找应用聊天记录、聊天对象的功能,此外它还支持为用户使用苹果地图时提供应用内置服务等功能。通过官方文档我们可以看到SiriKit框架支持的六类服务分别是:

  • 语音和视频通话
  • 发送消息
  • 收款或者付款
  • 图片搜索
  • 管理锻炼
  • 行程预约

SiriMaps通过Intents extension的扩展方式和我们的应用进行交互,其中,类型为INExtension的对象扮演着Intents extension扩展中直接协同Siri对象共同响应用户请求的关键角色。当我们实现了Intents extension扩展并产生了一个Siri请求事件时,一个典型的Intent事件的处理过程中总共有这三个步骤ResolveConfirmHandle

  • Resolve阶段。在Siri获取到用户的语音输入之后,生成一个INIntent对象,将语音中的关键信息提取出来并且填充对应的属性。这个对象在稍后会传递给我们设置好的INExtension子类对象进行处理,根据子类遵循的不同服务protocol来选择不同的解决方案
  • Confirm阶段。在上一个阶段通过handler(for intent:)返回了处理intent的对象,此阶段会依次调用confirm打头的实例方法来判断Siri填充的信息是否完成。匹配的判断结果包括Exactly one matchTwo or more matches以及No match三种情况。这个过程中可以让Siri向用户征求更具体的参数信息
  • confirm方法执行完成之后,Siri进行最后的处理阶段,生成答复对象,并且向此intent对象确认处理结果然后执显示结果给用户看
 

具体的执行过程请参考文档讲解视频

创建Intents Extension

SiriKit通过添加App Extension的方式来完成集成,这是一种独立于应用本身运行的代码结构,作为应用的扩展功能,只有在需要的时候系统会唤醒这些Extension代码来执行任务,然后在执行完毕之后将其杀死。另一方面,这些Extension在运行过程中的可占用内存是较少的,并且由于调用时机的限制,我们也无法在运行期间做一些坏事

 

现阶段集成SiriKit的条件是需要将开发工具升级到Xcode8,需要使用开发者账号到官方网站去下载Xcode8_beta版,并且需要将一台测试设备升级到iOS10系统。选中我们的应用,进入项目总览界面,新增一个TARGET

 
 

如上图所示,我创建的Intents Extension被我命名为LXDSiriExtension。记住在创建好一个Extension的时候,会询问你是否激活这个扩展,勾选是。另外还会提示你是否连同Intents UI Extension一并创建了,我们同样选是。这样我们在项目下面总共创建了LXDSiriExtensionLXDSiriExtensionUI两个TARGET,这两个文件目录下面分别存在着一个新的info.plist文件,这个文件用来设置intent事件发生时我们设置的处理类。这里借用WWDC在讲解时的一张ppt来了解:

 

按图中的层次展开,IntentsSupportedIntentsRestrictedWhileLocked分别是两个字符串数组,每一个字符串表示的是应用扩展处理的intent事件的类名。前者表示支持的事件类型,后者表示在非锁屏状态下执行的事件类型。文件默认是workout类型的事件,在这里笔者改成了发送消息INSendMessageIntent。除此之外,NSExtensionPrincipalClass对应的是INExtension子类类名,这个类用来获取处理intent事件的类。

plist设置

另外,官方讲解中提到了Embedded frameworks,在session中苹果开发人员通过一个消息聊天应用来示例集成SiriKit。由于应用扩展自身的运行机制和应用本身的运行机制不同,彼此之间创建的类是不能访问使用的。因此把我们需要的类开发成frameworks的方式导入我们的应用之后就能够在两种之中都使用到这些类。本文未使用frameworks导入功能,而是模拟了一个类用来管理事件处理过程中的部分逻辑,但是Embedded frameworks这个使用的准则需要记住。这个模拟类的具体代码如下:

在完成这些需要的工作之后,我们还需要对应用本身的Info.plist配置文件进行设置,新增一个关键字为NSSiriUsageDescription的字符串对象,对应填写的字符串将在我们征询用户Siri权限的时候显示给用户看。比如Siri想要访问您的应用信息之类的提示语。然后通过INPreferences类方法向用户请求Siri访问权限