阐述
最近研究了一下SiriKit,感觉有点意思,记录并与大家探讨一下。
工欲善其事必先利其器,在研究SiriKit模块时苹果官方介绍通篇充斥着Intent、Resolve、Confirm等词汇,让英语未过六级的我感到无比吃力。感觉词汇还是有必要给大家介绍一下,顺便统一单词说法以便大家能够看懂后续内容。
词汇确认: (箭头后为文章所用含义)
Intent 意图,想法,倾向 —> 意图
Resolve 解决,决心,分解 —> 解析
Confirm 确认,确定,批准 —> 确认
Handle 处理,操作,搬运 —> 处理
探讨
1 程序拓展类型
在开始之前,首先介绍一下苹果给我们提供的与SiriKit开发相关的拓展。
这两类拓展都是用来附加额外的业务逻辑处理,当然并不是必须要集成到主程序中(后续有介绍)。
拓展种类:
-
Intents App Extension Siri意图处理拓展
-
Intents UI App Extension Siri意图定制界面拓展(可以使用苹果提供的原生界面,或者自定义界面)
2 用户 - Siri - [拓展] - 应用 服务流程
2.1 图示层次
上图中的Intents App Extension、Your App services不是必要的,在Siri不需要用户进一步提供信息时可直接与应用交流,当然我们在处理复杂业务的时候(如签到业务需要在Siri界面判断登录逻辑),是需要集成拓展的。
2.2 代码层次
当用户向Siri发出请求时,SiriKit会首先通过每个应用的Info.plist文件找到意图(Intent)所属的应用。随后判断该意图(Intent)添加方式是否为直接捐献(Donate)。
若为直接捐献,SiriKit会直接启动应用并在AppDelegate的application(application: continue userActivity: restorationHandler: ) 方法中给开发者通知。
若相反的话,SiriKit会加载当前应用的所有Siri意图处理拓展( Intents App Extension ), 并通过各自拓展的Info.plist文件中NSExtension-NSExtensionAttributes-IntentsSupported对应数组进行匹配,找到对应的拓展并创建该拓展所绑定的INExtension子类实例。INExtension子类实例会调用 handler(for: ) 方法将用户请求分发给开发者针对每个业务所编写的IntentHandler对象。
(该IntentHander不是指系统直接生成的文件,而是指我们针对每个Intent编写的并且遵守每个Intent的IntentHandling协议的类文件。IntentHandling协议定义了处理Intent的必要方法)
这里的INExtension子类相当于上图中的程序服务组合包(App services),而每个Intent的专属IntentHandler相当于单个服务的处理对象。
注意:
SiriKit处理同一个意图(Intent)请求时,会多次创建对应服务的专属IntentHander对象来执行方法,而不是直接生成一个长久的对象来持续调用,所以不要在对应服务的IntentHandler对象中存储状态信息。
(https://developer.apple.com/documentation/sirikit/dispatching_intents_to_handler_objects)
3 单个服务IntentHandler执行过程
Intent的专属IntentHandler对象处理用户请求时会大致分三个