SiriKit官方文档 - Part1-2 创建一个Intents扩展

最近在看SiriKit的官方文档,自啃 + Google翻译,如有错误或语义不当还望指出。

官方文档原文 - Creating an Intents Extension

与SiriKit的交互发生在你的Intents扩展,它是你在iOS应用Bundle中提供的App扩展。所以你必须先有一个iOS应用后才能创建Intents扩展。Intents扩展处理了大多数与SiriKit的交互,但你的iOS应用需要察觉到这些交互并在某些情况下可能会发挥积极作用。

在向iOS应用添加Intents扩展程序时,你必须执行以下操作:

注意

如果要自定义Siri或Maps显示的界面,你还可以向你的iOS应用添加Intents UI扩展。Intents UI扩展不能替代Intents扩展,如果你提供了Intents UI扩展,则还必须提供一个Intents扩展。有关创建Intents UI扩展的信息,参阅创建Intents UI扩展

有关如何创建应用扩展的信息,参阅App Extension Programming Guide

配置你的Xcode项目

配置Xcode项目需要几个步骤。除了向你的项目添加Intents扩展目标之外,你还必须对iOS应用进行一些细微的更改。

要使用SiriKit,你必须在iOS应用中启用Siri功能。你启用此功能的方式与启用其他功能(如iCloud,通知推送和应用内购买等)相同。启用它会向应用添加权限(entitlements),让App Store知道你的应用支持Siri。

在你的iOS应用中启用Siri功能

  1. 在Xcode中打开iOS应用项目。
  2. 在项目设定中,选取你的iOS应用目标(Targets)。
  3. 选择功能选项卡(Capabilities)。
  4. 启用S​​iri功能。

Xcode将Siri entitlements添加到你的iOS应用中。App Store要求包含Intents扩展的应用存在此权限。

启用S​​iri支持后,给项目添加一个新的Intents扩展target。添加target会提供了构建Intents扩展所需的初始文件,你需要配置你的Xcode项目,编译这个扩展并将其包含在iOS应用bundle中。

在应用中添加Intents扩展

  1. 在Xcode中打开现有的iOS应用项目。
  2. 选择File > New > Target。
  3. 从相应平台的应用扩展组(Application Extension group)中选择意图扩展(Intents extension)。
  4. 点击Next。
  5. 指定扩展名称并配置语言和其他选项。如果准备自定义Siri界面的某些部分,请勾选包含UI扩展(Include UI Extension)选项。
  6. 单击Finish。

注意

你可以向应用添加多个Intents扩展,但每个扩展必须支持不同的意图。仅当要减少每个扩展的内存占用或者提高性能表现才需要创建多个扩展。

将你的Intents扩展target添加到你的项目后,通过修改Xcode提供默认Info.plist文件以指定支持的Intent。SiriKit通过扩展的Info.plist文件中的信息来确定哪些意图需要路由到你的扩展。

指定扩展支持的意图

  1. 在Xcode中,选择你的Intents扩展的Info.plist文件。
  2. 展开NSExtension和NSExtensionAttributes Keys可以看到IntentsSupported和IntentsRestrictedWhileLocked这两个Keys。
  3. 在IntentsSupported Key中,为扩展处理的每个意图添加一个String项。将每项的值设置为意图的类名。 这个Key是必需的。你可以支持给定域中的所有意图,或者仅支持其中的一些,并且单个扩展可以支持多个域。
  4. 在IntentsRestrictedWhileLocked Key中,为需要设备非锁定状态的每个意图添加一个String项。将每项的值设置为意图的类名。此Key是可选的。某些意图是需要用户设备解锁后才能执行,例如涉及金融交易的意图。在默认情况下,你可以使用此Key作为锁定设备的Intents来扩充默认列表。

当用户语义不明确被解析为多个意图时,SiriKit会使用IntentsSupported Key中intents的顺序来确定发送到App的意图。将最相关的一组意图放在数组中来管理intents。当你的Intents扩展支持具有类似语义的多个域时,优先化你的意图尤其重要。例如,同时支持呼叫和消息意图的App可能会选择在发起呼叫和发送消息中有限选择发送消息。

某些意图可能需要你的Xcode项目或App的额外配置步骤。例如,当实现乘车预定App时,Maps希望提供描述你的服务覆盖区域的GeoJSON文件。有关特定意图的任何其他配置步骤的信息,请参阅在意图域中这些意图的说明。

在你的iOS应用中请求Siri授权

用户必须授予你的App使用SiriKit的权限。要请求App的权限,请进行以下操作:

  1. 在iOS应用的Info.plist文件中包含NSSiriUsageDescription Key。此键的值是一个用于描述你的App与SiriKit共享信息的字符串。例如,锻炼App可将值设置为字符串”锻炼信息将发送到Siri“。
  2. 在App运行中的某个时刻调用INPreferences的requestSiriAuthorization:类方法。

你的iOS应用第一次调用requestSiriAuthorization:方法时,系统会显示一条提示用户授权你的App的提醒。警报包括你在App的Info.plist文件的NSSiriUsageDescription Key中提供的用法描述字符串。用户可以批准或拒绝授权请求,稍后可以在“设置”应用中更改App的授权状态。该系统会记住你的App的授权状态,以便对requestSiriAuthorization:方法的后续调用不会再次提示用户。

注意

当用户首次尝试使用Intent扩展时,Maps可以帮助你授权。具体来说,如果用户与授权状态尚未确定的扩展程序互动,则Maps会代表该扩展程序自动请求授权。

应用必须启用Siri功能才能成功授权。有关如何启用Siri功能的信息,请参阅配置你的Xcode项目

构建你的应用程序的服务

你的Intents扩展是你的App行为的代表,因此它必须能够执行与你的App相同的服务。由于你的iOS应用和Intents扩展可能执行许多相同的任务,你可能需要考虑重构你的代码。具体来说,请考虑以下几点:

  1. 在私有共享框架(private shared framework)中实现你的核心服务。 私有共享框架允许你在一个代码模块中定义核心服务,并将代码动态链接到你的iOS应用程序和Intents扩展。使用框架最小化两个可执行文件的大小,并确保两者使用相同的代码。
  2. 使用共享容器来存储公共资源。 将相关的图像和数据文件放入共享容器,以便它们也可以由你的Intents扩展访问。你可以在iOS应用的“功能(Capabilities)“标签中启用共享容器支持,并启用Intents扩展target。

测试你的扩展

你必须在真实设备上运行来测试Intents扩展。Xcode支持直接从Xcode项目启动Intents扩展,也支持在设备上运行时对其进行调试。

在设备上运行和调试Intents扩展

  1. 选择Intents扩展的build scheme。当你向项目添加Intents扩展时,Xcode会自动创建运行该扩展的build scheme。
  2. 选择在连接的设备上运行。你不能在模拟器中调试你的Intents扩展。
  3. 选择Product > Run以在设备上启动你的扩展。
  4. 当Xcode提示时,选择Siri(或Maps)作为运行的应用程序。Xcode会构建你的App和扩展程序,将其安装在设备上,并启动你选择的App。

当首次安装你的扩展程序时,Siri可能无法立即识别你的App扩展程序。你可能需要等待几分钟才能发出任何相关命令。同样,在更新Info.plist文件时,你可能需要等待几分钟,Siri才会识别任何更改。

从你的iOS应用使用Intents框架

你的iOS应用必须使用Intents Framework的某些部分来执行特定任务:

  1. 使用INVocabulary类来注册用户特定的词汇术语。注册用户特定的词汇仅适用于你的App的单个用户特定的术语,并且Siri可能需要帮助理解;不要注册常用或易于理解的术语。有关注册词汇的信息,参阅指定自定义词汇表
  2. 使用INPreferences类来请求用户处理意图的权限,参阅在你的iOS应用中请求Siri授权
  3. 当你想向系统贡献交互时,创建INInteraction对象。贡献交互需要你提供用户正在做什么的上下文。系统和其他应用可以使用该信息改进搜索结果以完善用户体验。有关更多信息,请参阅INInteraction Class Reference

国际化和Siri

在实现Intents扩展时,始终根据设备的当前语言设置返回内容。如果你的应用与你的应用扩展共享本地化内容,请始终以用户指定的语言提供该内容。不要使用Siri语言指定本地化资源,这可能与设备配置的语言不同。

有关本地化iOS应用和Intents扩展的详细信息,参阅Internationalization and Localization Guide

SiriKit译文系列

SiriKit官方文档 - Part1-1 SiriKit介绍
SiriKit官方文档 - Part1-2 创建一个Intents扩展
SiriKit官方文档 - Part1-3 解决和处理意图
SiriKit官方文档 - Part1-4 指定自定义词汇
SiriKit官方文档 - Part1-5 创建Intents UI扩展
SiriKit官方文档 - Part2-1 参考-意图域
SiriKit官方文档 - Part2-2 参考-App词汇文件格式