SiriKit实践 - 基于融云实现使用SiriKit发送消息

上篇我们讲了App Extension,这篇就是纯SiriKit相关的了,主要是基于融云实现SiriKit发送消息

吐槽一下,在写这个Demo之前,github上几乎每个demo都番了个遍,本来想站在巨人的肩膀上,没想到几乎都是创建了工程然后带着初始化的代码就提交上去了。稍好一点的,就是在自建UI部分,加了个图,但是没有任何与数据的交互😂。最后各种猜测、尝试、踩坑完成了这个Demo。

20-SiriKit-Practice-00

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

20-SiriKit-Practice-07

创建后是这样的:

创建完成后你会发现有示例代码和默认配置了消息相关的三个意图

Intent Extension

//待补
协议方法实现
resolve 匹配数据并检查够不够,坑点,INPerson匹配的是手机联系人,很毒,必须实现
confirm 提示是否要进行处理,可选
handle 进行处理并告知处理结果,必须实现

Intent Handle可以拆分来实现,同一个意图域的建议一起实现,不同意图域的建议拆分实现,以减少内存,注意对应的方法SiriKit官方文档翻译-意图域

快速completion,否则会Siri会自己处理了

Intent UI Extension

//待补
协议方法实现
根据协议方法传来的信息进行赋值处理
隐藏默认界面
快速进行界面搭建,否则会Siri会用默认界面自己处理

自定义词汇

暂未尝试,一般健身应用用的多,因为不同的健身嘛,具体可看文档 SiriKit官方文档 - Part1-4 指定自定义词汇

吐槽

  1. 调试比较费劲
    因为是不同的Target,基本上就是只能调试其中一个,要么调试Intent逻辑,要么调试Intent UI界面,你想看逻辑到UI全过程?抱歉做不到。
    因为SiriKit要求快速响应,所以在某个协议方法里大概10来秒没有处理完,手机界面上就自己走后面的流程了。打断点的时候蛋疼的要死,虽然断点还在原位不会跟着走。

  2. Intent UI获取到的宽度是手机屏幕宽度,然而显示的时候你的View左右是会距离有间距的。然后尝试了各种获取宽度,都获取不到如图所示的间距。

  3. 因为SiriKit要处理(学习?)一下你的扩展的逻辑,所以Run后,马上用测试不一定是新的逻辑,这点太坑了。

参考