关于SiriKit
在6月14日凌晨的WWDC2016
大会上,苹果提出iOS10
是一次里程碑并且推出了十个新特性,大部分的特性是基于iPhone
自身的原生应用的更新,具体的特性笔者不在这里再次叙述,请看客们移步WWDC2016下载自行观赏。要说里程碑在笔者看来有些夸大其实了,不过新增的通知中心联动3D Touch
确实为人机交互带来新的发展,另外一个最大的亮点在于Siri
的接口开放。在iOS10
中提供了SiriKit
框架在用户使用Siri
的时候会生成INExtension
对象来告知我们的应用,通过实现方法来让Siri
获取应用想要展示给用户的内容
在iOS10
之后,苹果希望Siri
能够给用户带来更多的功能体验,基于这个出发点,新增了SiriKit
框架。Siri
通过语言处理系统对用户发出的对话请求进行解析之后生成一个用来描述对话内容的Intents
事件,然后通过SiriKit
框架分发给集成框架的应用程序以此来获取应用的内容,比如完成类似通过文字匹配查找应用聊天记录、聊天对象
的功能,此外它还支持为用户使用苹果地图时提供应用内置服务
等功能。通过官方文档我们可以看到SiriKit
框架支持的六类服务分别是:
- 语音和视频通话
- 发送消息
- 收款或者付款
- 图片搜索
- 管理锻炼
- 行程预约
Siri
和Maps
通过Intents extension
的扩展方式和我们的应用进行交互,其中,类型为INExtension
的对象扮演着Intents extension
扩展中直接协同Siri
对象共同响应用户请求的关键角色。当我们实现了Intents extension
扩展并产生了一个Siri
请求事件时,一个典型的Intent
事件的处理过程中总共有这三个步骤Resolve
、Confirm
和Handle
:
Resolve
阶段。在Siri
获取到用户的语音输入之后,生成一个INIntent
对象,将语音中的关键信息提取出来并且填充对应的属性。这个对象在稍后会传递给我们设置好的INExtension
子类对象进行处理,根据子类遵循的不同服务protocol
来选择不同的解决方案Confirm
阶段。在上一个阶段通过handler(for intent:)
返回了处理intent
的对象,此阶段会依次调用confirm
打头的实例方法来判断Siri
填充的信息是否完成。匹配的判断结果包括Exactly one match
、Two 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
一并创建了,我们同样选是。这样我们在项目下面总共创建了LXDSiriExtension
和LXDSiriExtensionUI
两个TARGET
,这两个文件目录下面分别存在着一个新的info.plist
文件,这个文件用来设置intent
事件发生时我们设置的处理类。这里借用WWDC
在讲解时的一张ppt
来了解:
按图中的层次展开,IntentsSupported
和IntentsRestrictedWhileLocked
分别是两个字符串数组,每一个字符串表示的是应用扩展处理的intent
事件的类名。前者表示支持的事件类型,后者表示在非锁屏状态下执行的事件类型。文件默认是workout
类型的事件,在这里笔者改成了发送消息INSendMessageIntent
。除此之外,NSExtensionPrincipalClass
对应的是INExtension
子类类名,这个类用来获取处理intent
事件的类。
另外,官方讲解中提到了Embedded frameworks
,在session
中苹果开发人员通过一个消息聊天应用来示例集成SiriKit
。由于应用扩展自身的运行机制和应用本身的运行机制不同,彼此之间创建的类是不能访问使用的。因此把我们需要的类开发成frameworks
的方式导入我们的应用之后就能够在两种之中都使用到这些类。本文未使用frameworks
导入功能,而是模拟了一个类用来管理事件处理过程中的部分逻辑,但是Embedded frameworks
这个使用的准则需要记住。这个模拟类的具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import Intents class LXDMatch { var handle: String? var displayName: String? var contactIdentifier: String? convenience init(handle: String, _ displayName: String, _ contactIdentifier: String) { self.init() self.handle = handle self.displayName = displayName self.contactIdentifier = contactIdentifier } func inPerson() -> INPerson { return INPerson(handle: handle!, displayName: displayName, contactIdentifier: contactIdentifier) } } class LXDAccount { private static let instance = LXDAccount() private init() { print("only call share() to get an instance of LXDAccount") } class func share() -> LXDAccount { return LXDAccount.instance } func contact(matchingName: String) -> [LXDMatch] { return [LXDMatch(handle: NSStringFromClass(LXDSendMessageIntentHandler.classForCoder()), matchingName, matchingName)] } func send(message: String, to recipients: [INPerson]) -> INSendMessageIntentResponseCode { print("Send a message: \"\(message)\" to \(recipients)") return .success } } |
在完成这些需要的工作之后,我们还需要对应用本身的Info.plist
配置文件进行设置,新增一个关键字为NSSiriUsageDescription
的字符串对象,对应填写的字符串将在我们征询用户Siri
权限的时候显示给用户看。比如Siri想要访问您的应用信息
之类的提示语。然后通过INPreferences
类方法向用户请求Siri
访问权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import Intents INPreferences.requestSiriAuthorization { switch $0 { case .authorized: print("用户已授权") break case .notDetermined: print("未决定") break case .restricted: print("权限受限制") break case .denied: print("拒绝授权") break }("拒绝授权") break }de>iPhone自身的原生应用的更新,具体的特性笔者不在这里再次叙述,请看客们移步WWDC2016下载自行观赏。要说里程碑在笔者看来有些夸大其实了,不过新增的通知中心联动 3D Touch 确实为人机交互带来新的发展,另外一个最大的亮点在于Siri 的接口开放。在iOS10 中提供了SiriKit 框架在用户使用Siri 的时候会生成INExtension 对象来告知我们的应用,通过实现方法来让Siri 获取应用想要展示给用户的内容
Siri服务
在
创建Intents Extension
现阶段集成 如上图所示,我创建的 按图中的层次展开, plist设置
另外,官方讲解中提到了
在完成这些需要的工作之后,我们还需要对应用本身的
|