上篇我们讲了App Extension,这篇就是纯SiriKit相关的了,主要是基于融云实现SiriKit发送消息
吐槽一下,在写这个Demo之前,github上几乎每个demo都番了个遍,本来想站在巨人的肩膀上,没想到几乎都是创建了工程然后带着初始化的代码就提交上去了。稍好一点的,就是在自建UI部分,加了个图,但是没有任何与数据的交互😂。最后各种猜测、尝试、踩坑完成了这个Demo。
SiriKit
Siri是通过对用户的语句进行分析成大致的指令来进行一些操作,之前Siri只能完成一些系统的控制。iOS 10后新增的SiriKit让第三方应用能够接入,为一些不方便用手交互的时候提供语言上的交互。
意图域与意图
用户语句的识别和分解成指令本就是一个比较复杂的过程,而SiriKit简化了这些,SiriKit会识别用户的语句,并拆分有用的信息传递给我们。
苹果官方定义了Intent Domain
(意图域)和Intent
(意图)的概念,实际上本质就是一个信息拆解的归类。意图域
是比较大的划分,每个意图域
下有各自支持的意图
,最终分析来把可能你需要的信息交给你。
比如: “发消息给y说z”,SiriKit分析后它属于消息
意图域下的发消息
意图,然后把y和z解析给你(具体解析了什么请往后看)
如何支持
根据官方文档,你需要在创建后来指定配置你的App支持哪些意图域
和其下面的哪些意图
。用户说出的语句被解析成指令后,首先会匹配App名称,然后匹配解析出来的意图是否和你支持的一致,如果一致才会给你的App进行处理。
比如: 你的App叫x,支持了消息
意图域下的发消息
意图。用户安装后说”使用x发消息”,SiriKit分析后用户想用名字是x的应用,意图是消息
意图域下的发消息
,而你的App支持了,就会让你进行处理(具体处理请往后看)。如果没装App或者没支持这个意图,那么你什么都收不到。
支持情况
根据官方文档,目前SiriKit支持VoIP呼叫(3)、消息(3)、付款(2)、照片(2)、锻炼(5)、乘车预定(3)、CarPlay(7)和餐厅预定(5)共计8 Intent Domian(意图域)下共计30种Intent(意图, 括号内数字表示意图数量),具体可查看:SiriKit官方文档翻译-意图域。
目前应用场景
从国内来看,QQ支持的是消息/VoIP呼叫,Uber和滴滴支持的是乘车预定,Keep支持的是锻炼。
上手实践
经过各种考虑后,决定从消息这个意图来尝试,优点有: 直观、聊天接入方便、应用场景多、参考文章/Demo好找(然而我错了,SiriKit真正实践的Demo和文章是真的少)。这次实现的Demo地址
创建扩展
其实际包含两项Intents Extension
(处理逻辑, 必选),Intents UI Extension
(自定义展示, 可选)。在创建的Intents
的时候,根据是否要自定义UI来勾选Inclue UI Extension
创建后是这样的:
创建完成后你会发现有示例代码和默认配置了消息相关的三个意图
Intent Extension
//待补
协议方法实现
resolve 匹配数据并检查够不够,坑点,INPerson匹配的是手机联系人,很毒,必须实现
confirm 提示是否要进行处理,可选
handle 进行处理并告知处理结果,必须实现
Intent Handle可以拆分来实现,同一个意图域的建议一起实现,不同意图域的建议拆分实现,以减少内存,注意对应的方法SiriKit官方文档翻译-意图域
快速completion,否则会Siri会自己处理了
Intent UI Extension
//待补
协议方法实现
根据协议方法传来的信息进行赋值处理
隐藏默认界面
快速进行界面搭建,否则会Siri会用默认界面自己处理
自定义词汇
暂未尝试,一般健身应用用的多,因为不同的健身嘛,具体可看文档 SiriKit官方文档 - Part1-4 指定自定义词汇
吐槽
调试比较费劲
因为是不同的Target,基本上就是只能调试其中一个,要么调试Intent逻辑,要么调试Intent UI界面,你想看逻辑到UI全过程?抱歉做不到。
因为SiriKit要求快速响应,所以在某个协议方法里大概10来秒没有处理完,手机界面上就自己走后面的流程了。打断点的时候蛋疼的要死,虽然断点还在原位不会跟着走。Intent UI获取到的宽度是手机屏幕宽度,然而显示的时候你的View左右是会距离有间距的。然后尝试了各种获取宽度,都获取不到如图所示的间距。
因为SiriKit要处理(学习?)一下你的扩展的逻辑,所以Run后,马上用测试不一定是新的逻辑,这点太坑了。