SiriKit使用简介

介绍SiriKit

SiriKit是让你的内容通过Siri展示的一个框架库。当用户向Siri请求特别类型的服务时,系统就会使用Intents Extension(自定义)来支持那些服务,如果需要图形界面交互,还可以创建Intents Extension UI来在Siri界面上显示自定义的UI界面。
目前为止,Siri只支持下面的6种服务类型:

  • 语音或者视频呼叫
  • 信息通讯
  • 支付功能
  • 查找图片
  • 锻炼
  • 预约出行工具

交互过程

QQ20160728-1
QQ20160728-1

1 Siri语义解析,得到一个Intent,传给Intent Extension处理
2 自定义处理对象时限相关服务域协议,resolve、confirm、handle(必须有)三个步骤某个intent。
3 返回XXXIntentResponse对象给Siri,用于回馈一个intent的响应

Siri和Maps通过intent扩展于你的app进行交互。intent扩展的入口点事INExtension对象,其唯一的工作就是让Siri能够响应到用户的请求。当要实现一个intent扩展时,有三个类型对象是你会经常用到的:

  • 一个定义了用户的intent以及包含Siri从用户收集到的信息的intent对象。
  • 一个自定义处理对象,你可以用来解析、确认、处理某个intent。
  • 一个数据对象,用于回馈一个intent的响应对象。

当有合适给你的扩展处理的intent时,Siri会向你的INExtension对象索要一个可以用来处理的这个intent的对象。
一个处理对象,可以是想要的任意类型。但它必须实现一些特殊的方法,以此来处理传递过来的intent。
每个intent的处理必须采用相关的协议。该协议的方法有三类:解析方法、确认方法、处理方法。
你可以在这些方法里面实现如何处理某个intent,并且返回那些提供给Siri的数据。
下面的图片显示了在Siri和你的扩展里面的处理程序对象中的高级别流。
在这个例子中,当用户使用出行预约服务请求一个预约时,Siri创建一个包含出行的参数的intent对象,并将它发送到适合的扩展。
解析处理方法分析这个intent包含的这些值是否能够满足乘坐值。当所有的出行参数都得到解决,Siri询问用户要如何处理这个请求以及执行任何最终的验证。
在确认阶段,处理程序提供了一个包含出行细节的响应对象,Siri会将这个对象呈现给用户。
如果用户接受了这个出行预约,Siri就会要求处理程序来处理这个intent。而处理程序则进行处理,并返回一个详细的响应结果

项目配置

为了支持SiriKit,必须先添加一个intent扩展到你的应用。
添加应用扩展:Intents Extension,假如你想自定义在Siri的界面,则勾选包含UIExtension选项;

Paste_Image.png

打开Intent Extension的info.plist,在NSExtensionNSExtensionAttributes键下,可以看到 IntensSupportedIntentsRestrictedWhileLocked,分别代表着支持的Intent和锁屏状态下支持的Intent。而NSExtensionPrincipalClass字段定义了处理Intent的入口类(继承于INExtension)。

info.plist

解析以及处理Intents

当Intent传入到入口类中,首先会调用- (id)handlerForIntent:(INIntent *)intent;方法,该方法的返回值是一个实现了XXXIntentHandling协议的对象,也就是上文中的处理类。
每一个XXXIntentHandling协议中会定义一个必须实现的handle方法,一个可选的confirm方法,和若干reslove方法(依据当前场景下Intent参数而定)。

比如PaymentINSendPaymentIntentHandling协议

功能 代码
处理方法 - handleSendPayment:completion:
确认方法 - confirmSendPayment:completion:
解析货币单位方法 - resolveCurrencyAmountForSendPayment:withCompletion:
解析附加语方法 - resolveNoteForSendPayment:withCompletion:
解析付款方式方法 - resolvePaymentMethodForSendPayment:withCompletion:
解析收款人方法 - resolvePayeeForSendPayment:withCompletion:

依照不同的场景(Intents Domains)和不同的命令,协议中的解析方法数目会变化。每一个解析方法都需要得到一个INIntentResolutionResult类型的实例,用来保存校验结果。

INIntentResolutionResult及其子类有不同的构造方法生成不同类型的结果,用来指定和Siri的交互。

值类型 说明
INIntentResolutionResult
+ (instancetype)needsValue; 需要一个值,Siri会提示用户给一个值
+ (instancetype)notRequired; 不是必要的,是否给值都会过这个resolve
+ (instancetype)unsupported; 不支持的,Siri会提示用户这个值不被支持
INBooleanResolutionResult
+ (instancetype)successWithResolvedValue:(BOOL)resolvedValue; 成功解析
+ (instancetype)confirmationRequiredWithValueToConfirm:(nullable NSNumber *)valueToConfirm; Siri提示用户确认当前是否是一个bool值

当一个intent的所有参数都成功解析了,处理程序就会向用户询问是否确认这个intent的细节,并且提供一个建议响应。当所有参数被成功解析后,或者在不要求所有参数进行解析,那么就认为是解析成功。
在确认期间,就可以执行所有的intent参数的附加验证,以确保你可以使用该信息来执行所请求的服务。如果之前的解析函数是单元测试,那么这个确认函数就是集成测试,保证所有输入参数正确。

最后一个处理intent的阶段,就是执行与这个intent相关的动作。在-handleSendPayment:completion函数中做相应业务逻辑,需要注意的是你在Extension中做的修改也应当反应到App主程序当中,所以需要提供任务的数据给到App。SiriKit提供了一个包含intent细节(INIntent、INIntentResponse)的InInteraction对象,你可以使用userActivityInstance.interaction得到它,在App启动时调用
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler
函数处理来自Extension的数据。

自定义界面(Intent UI Extension)

上文说道,创建Extension的时候,可以在新建页面勾选UI Extension选项,创建一个Extension工程来展示页面。

配置

同样我们打开UI Extension的info.plist文件,我们能看见NSExtension键,其中有NSExtensionMainStoryboard
这个键值,用来指定入口的StoryBoard。和App不一样的是,如果不适用StoryBoard方式,我们需要使用NSExtensionPrincipalClass这个键来指定入口的ViewController。

实现ViewController

系统创建了ViewController,加载视图,调用viewDidLoad方法并且调用了INUIHostedViewControlling协议的configureWithInteraction:context:completion:方法,传递了一个交互对象,用于配置界面。 当配置完成后,ViewController就会展示在Siri或者Maps应用界面的空白部分。这时会调用viewWillAppear/viewDidAppear方法。
当视图消失时,也会调用生命周期的viewWillDisappear/viewDidDisappear方法。

UI展示流程示意

关于控制器的使用,苹果给出了几点注意事项:

  • 切换子控制器来展示不同类型的内容。 你的Intents UI扩展只有一个主视图控制器,如果你想为不同的Intents展示不同的内容,你需要使用不同的视图。可以在configureWithInteraction:context:completion:这个方法里面,根据提供的intentObject来创建不同的子视图。

  • 在你的视图控制器可用的期间,动态调整内容。 在** viewDidAppear:方法里面才开始启动动画,在viewWillDisappear: **方法里面要结束动画。

  • 尽快的配置好你的视图控制器,这样Siri才能更快的展示它。 你的视图控制器也许不会在屏幕上停留太久,所以尽量利用本地资源以及提供的INInteraction对象来配置你的设置。如果你需要从服务器拉取更多的信息,请异步完成,并在稍后再更新你的界面。

  • 请不要在界面里面展示广告。你可以展示你自己的品牌信息,但是你不能够加入其它广告。

参考资料:
SiriKit 学习笔记
SiriKit编程指南

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 在这里放出原文链接地址 Part 5.1: 创建一个 Intents UI Extension 当你处理一个 In...
    李国安阅读 2,112评论 2 5
  • 在这里放出原文链接地址 Part 3.1: 分析与操作 Intents Intents Extension 的的入...
    李国安阅读 1,326评论 0 4
  • 关于SiriKit 在6月14日凌晨的WWDC2016大会上,苹果提出iOS10是一次里程碑并且推出了十个新特性,...
    sindri的小巢阅读 22,551评论 40 79
  • 概览 最新的WWDC2016大会上,苹果提出iOS10并推出了十个新特性,homekit、messageapp等等...
    cuagain阅读 2,195评论 0 5
  • 一、SiriKit介绍 Siri是一款苹果 iOS 系统提供的智能语音助手软件,它的全名是 Speech Inte...
    火星抄手阅读 5,549评论 15 19