概览
- 最新的WWDC2016大会上,苹果提出iOS10并推出了十个新特性,homekit、messageapp等等,大部分是基于iPhone原生应用的更新。其中最大的亮点之一是Siri的接口开放,在iOS10中提供了SiriKit框架在用户使用Siri的时候生成INExtension对象来告知我们的应用,我们可以通过SiriKit提供的API展示给用户更多的内容,提供更好的体验。
- Siri通过语言处理系统对用户发出的对话请求进行解析之后生成一个用来描述对话内容的Intent事件,然后通过SiriKit框架分发给集成框架的应用程序以此来获取应用的内容,比如通过文字匹配查找应用聊天记录、聊天对象,苹果demo演示的通过Siri向指定对象发送信息等功能,此外还支持为用户使用苹果地图时提供应用内置服务等功能。
SiriKit提供以下六类服务
- 语音和视频通话 VoIP calling
- 发送消息 Messaging
- 收款或者付款 Payments
- 图片搜索 Photo search
- 管理锻炼 Workouts
-
行程预约 Ride booking
下面来看一下一个典型的Siri进行交互的语句:
其中有三类关键部分:Intent、App以及其他信息。Intent就是我要想要通过Siri去做的事的意图,App是通过手机安装的什么App来做,至于其他的Payee、Amount等信息则是通过App去完成Intent的必须信息。而整个Siri的交互过程可以参照下图:
通过Siri来获取用户语言中的关键词汇,这些词汇在Extension中经过一些逻辑处理,最终反馈到用户界面,与用户进行交互。
Siri通过Intents extension的扩展方式和我们的应用进行交互,其中Intents Extension扮演协同Siri共同响应用户的角色,Intents UI Extension可以提供自定义的用户响应界面,用以增强体验。
当我们实现了Intents extension扩展并产生了一个Siri请求事件时,Intent(意图)事件的处理过程分Resolve、Confirm和Handle三个步骤。
Intent处理的三个阶段
- Resolve阶段:
帮助Siri明白用户的含义
影响Siri的行为
提供resolution response
在Siri获取用户的语音输入之后,生成一个INIntent对象,将语音中的关键信息提取出来并且填充对应的属性,该对象会传递给我们设置好的INExtension子类对象进行处理,根据子类遵循的不同protocol来选择不同的解决方案。通过handler(for intent:)返回处理intent的对象,此对象会调用resolve打头的实例方法来对Siri的响应进行一系列的信息处理,比如是否需要进一步的信息提示等。在resolve阶段提供了以下方法:
successWithResolvedPerson:成功找到匹配的人
disambiguationWithPeopleToDisambiguate:还需要挑选
confirmationRequiredWithPersonToConfirm:还需要确认下
needMoreDetailsForPerson:还需要更具体的信息,需要Siri进行询问
unsupportedWithReason:无法使用指定值
needsValue:需要某些必需值
notRequired:应用并没有要求某些值 -
Confirm阶段。
告诉Siri预期结果
检查必要的状态
提供Intent response
Siri提供必要的确认提示
Siri进行最后的处理阶段,生成答复对象,并且向此intent对象确认处理结果。大概长这样:
当然,这个界面是经过自定义的。
- Handle阶段:
执行请求操作
提供有关结果足够精确的信息
如果结果耗时的话还可提供loading
在Confirm方法执行完成之后,然后显示结果给用户看。该阶段完成后Intent的生命周期结束。
实现一个Siri Kit应用
- 升级到Xcode8,一台升级到iOS10的测试设备
- Intents extension : resolve、confirm、handle流程
- Intents UI extension 提供界面自定义等内容
- 新建一个空应用并新增一个target
- 新增Intents Extension,创建时会询问是否激活该扩展且是否将Intents UI Extension一并创建,都选择是。
-
了解Embedded frameworks
Embedded frameworks
Embedded frameworks是苹果着重提出来的,主要用于以下几个方面:
- 网络服务
- 数据model
- Decision-making logic
- 用户界面
可以在应用主target以及extension分别引用。
在创建extension之后,我们查看extension的plist文件,默认的plist结构如图所示:
IntentsSupported表示的是应用支持的Intent事件,IntentsRestrictedWhileLocked表示的是锁屏下支持的Intent事件。在demo中分别赋值:INSendMessageIntent。还要注意一下NSExtensionPrincipalClass,该项内容表示的是extension响应的入口类。其为INExtension的子类,需要实现handler(for intent: INIntent)方法如下:
用以根据不同的Intent分发各个自定义Handler进行处理。
另外还就是主项目plist 增加NSSiriUsageDescription 这个是请求Siri权限时提示的文案,同时使用Siri时,用户必须说出App的名字,也就是Bundle display name,都需要进行设置。其中UCSendMessageIntentHandler需要实现INSendMessageIntentHandling中的方法用以与Siri进行交互,也就是Resolve、Confirm和Handler三阶段的交互。
示例代码如下:
-
获取收件人信息,可以根据自身匹配的信息返回不同状态与Siri进行进一步的交互。
-
获取信息内容,也就是要给收件人发送的信息的具体内容。
-
收件人、信息内容确定后,通过Siri向用户进行信息确认。
-
信息确认后,进行最终信息的发送并向用户展示结果。
具体展示到界面上的效果图如下
至此,一个完整的通过Siri进行发送信息的完整流程结束。简要概括整个流程,可以参照苹果Keynote中的图示:
当然,在上面图例中,有开发者自定义的Siri反馈界面,这个界面的实现主要是通过Intents UI Extension来实现的。有兴趣的话,可以自行研究,实现方式也很简单。UI Extension的plist结构可以参照下图,只需要设置一下IntentsSupported即可。
总结
虽然苹果开放了SiriKit的入口,但是总体而言还是限制颇多,具体如何使用还是需要继续深入挖掘。类似可以自定义应用词汇、使用UI Extension过程中的内存管理等等。