SiriKit框架详细解析(四)—— 构建代码以支持App扩展和将意图调度到处理对象(一)

版本记录

版本号 时间
V1.0 2018.09.11

前言

大家都知道随着人工智能的发展,会掀起来另外一个工业革命,而语音识别就是人工智能的初始阶段,但是每个公司做的都不一样,涉及到一系列的语音的采集和算法实现,苹果的Siri就是业界语音识别的代表性的产品。接下来的几篇我们就详细解析一下SiriKit这个框架。感兴趣的可以看下面几篇文章。
1. SiriKit框架详细解析(一)—— 基本概览(一)
2. SiriKit框架详细解析(二)—— 请求授权使用SiriKit和INPreferences类(一)
3. SiriKit框架详细解析(三)—— 创建Intents App扩展(一)

Structuring Your Code to Support App Extensions - 构建代码以支持App扩展

将您的后端服务移至私有框架,以便您的应用和应用扩展程序可以使用它们。

应用扩展程序是代表您的应用,vending服务或在系统询问时向系统提供信息的代理。 由于它们会扩展您应用的行为,因此应用扩展程序通常需要访问您的应用使用的相同后端服务和数据。

如果您的应用和应用扩展程序共享服务,请考虑按以下方式构建代码:

  • Implement your core services in a private shared framework - 在私有共享框架中实现您的核心服务。 私有共享框架允许您在一个代码模块中放置用于访问服务的代码,并使用来自多个目标的代码。 共享框架通过确保每个可执行文件使用相同的代码路径来最小化两个可执行文件的大小并使测试更容易。

  • Use a shared container to store common resources - 使用共享容器来存储公共资源。 将相关图像和数据文件放入共享容器中,以便您的应用和应用扩展程序可以访问它们。 您可以在每个目标的Capabilities选项卡中启用共享容器支持。


Dispatching Intents to Handler Objects - 将意图调度到处理对象

为SiriKit提供一个能够处理给定意图的对象。

当用户使用SiriMaps向您的应用发出请求时,SiriKit会加载您的Intents应用扩展并创建其INExtension子类的实例。 扩展对象的工作是为SiriKit提供用于处理特定意图的处理程序对象。 您可以从扩展对象的handler(for:)方法中提供这些对象。

对于所有Intents应用程序扩展,handler(for:)方法的结构是相同的,并且该方法必须为Intents应用程序扩展支持的所有意图返回有效的新对象。 Listing 1显示了支持消息和VoIP呼叫域中的意图的方法版本。 在检查提供的intent对象的类型之后,该方法创建并返回能够处理该intent的对象。

// Listing 1 
Providing handler objects to SiriKit

override func handler(for intent: INIntent) -> Any {
   switch intent {
   case is INSendMessageIntent,
            is INSearchForMessagesIntent,
            is INSetMessageAttributeIntent:
      return MyMessageHandler()
            
   case is INStartAudioCallIntent:
      return MyAudioCallHandler()
            
   case is INStartVideoCallIntent:
      return MyVideoCallHandler()
            
   default:
      // The app extension should only be called for intents it knows about.
      fatalError()
   }
}

从处理程序返回的对象handler(for:)方法必须实现处理相应意图所需的特定协议。 每个intent对象都有一个关联的协议,其名称基于intent的名称。 例如,在处理INStartAudioCallIntent对象时,您提供了一个采用INStartAudioCallIntentHandling协议的对象。 该协议定义了您的对象必须实现的方法来解析任何意图参数,并让SiriKit知道您如何处理意图。

SiriKit通常在处理单个intent对象时创建处理程序对象的多个副本,并且在每个对象上只调用一个方法。 不要将缓存的状态信息存储在处理程序对象中,因为在后续方法调用期间不会出现该信息。 相反,应该始终对每个方法中的任何所需数据发出新的请求。

后记

本篇主要讲述了构建代码以支持App扩展和将意图调度到处理对象,感兴趣的给个赞或者关注~~~

SiriKit框架详细解析(四)—— 构建代码以支持App扩展和将意图调度到处理对象(一)_第1张图片

你可能感兴趣的:(SiriKit框架详细解析(四)—— 构建代码以支持App扩展和将意图调度到处理对象(一))