苹果官网文档是这样描述的:
In order to support SiriKit, apps must support one of the following domains:
- VoIP calling(语音、视频呼叫)
- Messaging(信息通讯)
- Payments(支付)
- Photo(查找图片)
- Workouts(健身)
- Ride booking(预约出行)
- Car commands (automotive vendors only)
- CarPlay (automotive vendors only)
- Restaurant reservations (requires additional support from Apple)
意图(Intents)
SiriKit 将上述六种行为描述为六种类型的意图(Intents),提供对应的Intent.framework
和用于UI展示的IntentUI.framework
两个工具包方便开发者实现上述功能。
意图的种类
意图的生命周期
一个典型的Intent
事件的处理过程中有这三个步骤Resolve
、Confirm
和Handle
Resolve
阶段。在Siri
获取到用户的语音输入之后,生成一个INIntent
对象,将语音中的关键信息提取出来并且填充对应的属性。这个对象在稍后会传递给我们设置好的INExtension
子类对象进行处理,根据子类遵循的不同协议来选择不同的解决方案。Confirm
阶段。在上一个阶段通过handlerForIntent:(INIntent *)
返回了处理Intent
的对象,此阶段会依次调用confirm
打头的实例方法来判断Siri
填充的信息是否完成。匹配的判断结果包括Exactly one match
、Two or more matches
以及No match
三种情况。这个过程中可以让Siri
向用户征求更具体的参数信息。Handle
阶段。在confirm
方法执行完成之后,Siri
进行最后的处理阶段,生成答复对象,并且向此Intent
对象确认处理结果然后执显示结果给用户看。
创建Intents Extension
SiriKit
通过添加App Extension
的方式来完成集成,这是一种独立于应用本身运行的代码结构,作为应用的扩展功能,只有在需要的时候系统会唤醒这些Extension
代码来执行任务,然后在执行完毕之后将其杀死。
条件:
- iOS10
- Xcode8
- 真机调试
新增Targets
开启Siri
组件
注意SiriKitDemo Extension
中的info.plist
文件
-
IntentsSupported
支持的意图类型,默认支持三种Messaging
类型 -
IntentsRestrictedWhileLocked
锁屏支持的意图类型,默认为空 -
NSExtensionPrincipalClass
处理意图的类,需继承自INExtension
授权
- 在主App目录的
info.plist
中,新增Key-Value
- 在需要请求授权时,调用以下方法:
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
switch (status) {
case INSiriAuthorizationStatusNotDetermined: {
NSLog(@"未决定");
break;
}
case INSiriAuthorizationStatusRestricted: {
NSLog(@"权限受限制");
break;
}
case INSiriAuthorizationStatusDenied: {
NSLog(@"拒绝授权");
break;
}
case INSiriAuthorizationStatusAuthorized: {
NSLog(@"已授权");
break;
}
}
}];
-
启动应用,请求授权对话框如下: