最近在看SiriKit的官方文档,自啃 + Google翻译,如有错误或语义不当还望指出。
当处理意图时,Siri和Maps通常会显示Intents扩展在标准界面中提供的响应对象的详细信息。如果要将自己的自定义内容添加到标准界面,则必须提供一个Intents UI扩展。
Intents UI扩展不会替换用于处理意图的Intents扩展。它是一个独立的应用扩展(App Extension),可以让你自定义如何给用户展示响应的意图。你可以使用自定义界面来显示其他详细信息或结合App的品牌信息,从而为用户提供更熟悉的体验。
如果你在以下域中支持Intents,则可以提供Intents UI扩展:
- 消息
- 付款
- 乘车预订
- 锻炼
Intents UI扩展中的主要对象是视图控制器(view controller),你可以使用它来显示自定义内容。Intents UI扩展只有一个视图控制器,因此视图控制器必须能够显示扩展所支持的任何Intents的内容。你愿意的话,可以考虑为每个意图创建单独的Intents UI扩展。
配置Xcode项目
用Xcode配置你的Intents UI扩展初始文件。当创建Intents扩展时,可以让Xcode同时创建一个Intents UI扩展。你也可以随时向你的项目单独添加Intents UI扩展。
向App中添加新的Intents UI扩展
- 用Xcode打开现有的iOS应用项目。
- 选择 File > New > Target。
- 从iOS Application Extension group中选择Intents UI扩展。
- 点击Next。
- 指定扩展名称并配置语言和其他选项。
- 单击Finish。
Xcode提供的模板中有一个Storyboard,Storyboard中有一个视图控制器。Siri和Maps都是在Storyboard文件中加载和展示初始视图控制器,所以请用初始化内容配置一下视图控制器。你可以在Storyboard中包含其他视图控制器,如果你准备在初始的视图控制器中将它们作为子控制器。你需要处理好初始视图控制器与Storyboard中其他视图控制器之间的所有交互。
你的Intents UI扩展的Info.plist文件可以让SiriKit知道你的扩展支持哪些意图。表5-1列出了扩展的Info.plist中的NSExtension
键的字典中必须包含的键。尤其注意在NSExtensionAttributes
键中指定Intents UI扩展支持的意图。
表5-1 Intents UI扩展的Info.plist文件的键
Key | Description |
---|---|
NSExtensionAttributes | 此键的值是字典。 此字典必须包含一个 IntentsSupported 键,其值是一个字符串数组。每个字符串的值是Intents UI扩展支持的intent类的名称。 此键的配置与你的Intents扩展相同。 |
NSExtensionMainStoryboard | 此键的值是包含扩展的视图控制器的Storyboard文件的名称。 如果你希望以编程方式初始化视图控制器,则可以用 NSExtensionPrincipalClass 键替换此键。 |
NSExtensionPointIdentifier | 此键的值必须是字符串com.apple.intents-ui-service 。 |
指定自定义界面支持的意图
- 在Xcode中,选择你的Intents扩展的Info.plist文件。
- 展开
NSExtension
和NSExtensionAttributes
键以显示IntentsSupported
键。 - 在
IntentsSupported
键中,添加你支持的每个意图(类型必须是String,并且值必须是意图的类名)。
有关要包含在Intents UI扩展的Info.plist文件中的键的更多信息,请参阅Information Property List Key Reference。
实现视图控制器
Storyboard文件的初始视图控制器显示你的自定义内容。在向用户显示任何UI之前,Siri或Maps会加载你的视图控制器并调用configureWithInteraction:context:completion:
方法。实现该方法并使用提供的交互对象来配置视图控制器的内容。上下文(context)参数告诉你视图控制器会显示在哪里,让你可以在Siri和Maps中以不同的方式显示你的内容。
你的视图控制器是前台界面的一部分当显示在屏幕上时,直到用户关闭Siri或Maps界面。你可以使用定时器或其他程序方法根据需要更新视图控制器的界面。当视图控制器在加载、显示和隐藏时也会接收正常的视图控制器的回调。但是,你的视图控制器在屏幕上时不会接收触摸事件或任何其他事件,并且你无法向其中添加手势识别器。所以,不要使用需要用户手动控制进行交互的控件或视图。
图5-1展示了Intents UI扩展及其视图控制器的高阶生命周期(high-level life cycle)。系统创建视图控制器并调用configureWithInteraction:context:completion:
方法,传递你需要用于配置界面的交互对象。配置后,你的视图控制器将在屏幕上Siri或Maps的剩余空间上显示。在屏幕上,你的视图控制器可以运行动画并使用定时器和其他编程方式更新视图,但它不会接收触摸事件或响应链事件。
图5-1 Intent UI扩展的生命周期
注意
当视图控制器在屏幕上时,地图可能再次调用
configureWithInteraction:context:completion:
方法来传递更新的信息供你显示。例如,Maps会调用此方法来为乘车预定提供状态更新。可以使用这些额外的调用来更新你的视图控制器的界面。
当用户关闭Siri或Maps界面时,系统将释放其对你的视图控制器和你的Intents UI扩展的引用。你的视图控制器应只显示信息。当视图控制器移出屏幕时,不要尝试保存数据或与App通信。
##实现Intents UI扩展的视图控制器提示:
- 将你的品牌融入你的界面。 使用App的配色、图片和其他设计元素是一种非常好的方式,可以增强App与Siri或Maps界面的关联程度,凸显与App关系。
- 使用子视图控制器在不同类型的内容之间切换。 你的Intents UI扩展只有一个主视图控制器。如果为不同的意图显示不同的内容,请使用子视图控制器来处理与该意图相关的视图。在你的
configureWithInteraction:context:completion:
方法中,基于intent对象的类型加载子视图控制器。 - 设置任何动画内容仅在视图控制器可见时运行。 等视图控制器的
viewDidAppear:
方法被调用时启动动画。在视图控制器的viewWillDisappear:
方法中停止动画。 - 尽快配置视图控制器的视图,以便Siri显示。 视图控制器可能不会显示很长时间,因此大多数配置请尽量使用本地资源和提供的INInteraction对象。如果你需要从服务器获取更多信息,请使用异步执行并在之后更新你的界面。
- 不要在界面中包含广告。 你可以包含与用户相关的品牌和信息,但禁止广告。
- 当你要隐藏自定义界面时,返回零大小。 当调用
configureWithInteraction:context:completion:
方法的完成block回调(completion block)时,如果不希望视图控制器显示在屏幕上,请指定CGRectZero
的大小。当没有为指定的意图显示的其他信息时,可以隐藏视图控制器。
有关配置视图控制器的更多信息,请参阅INUIHostedViewControlling Protocol Reference。
替换默认界面
对于乘车预订和消息的意图,如果系统提供的默认界面与你提供的界面冲突,你可以隐藏系统提供的。对于消息意图,Siri显示消息内容和收件人。对于乘车预订意图,Siri和Maps会显示一个用于展示用户位置的地图。如果你为自己的界面提供相同的信息,请使用INUIHostedViewSiriProviding
协议的属性来阻止系统界面的显示。
有关阻止默认地图和消息信息显示的更多信息,请参阅INUIHostedViewSiriProviding Protocol Reference。
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词汇文件格式