了解 SiriKit 概念

本文介绍在 Xamarin.iOS 应用中使用 SiriKit 所需的关键概念。

SiriKit 是 iOS 10 的新增功能,它允许 Xamarin.iOS 应用提供用户可以在 iOS 设备上使用 Siri 和 Maps 应用访问的服务。 此功能由系统使用新的“意向”和“意向 UI”框架在一个或多个应用扩展中提供

在 SiriKit 的助力下,iOS 应用可使用应用扩展、新的意向和意向 UI 框架,在 iOS 设备上为使用 Siri 和 Maps 应用的用户提供服务。

Siri 使用的概念,即相关任务的一组已知操作。 应用与 Siri 的每次交互都必须属于其已知的服务域之一,如下所示:

  • 音频或视频通话。
  • 预订车票。
  • 管理锻炼。
  • 消息。
  • 搜索照片。
  • 发送或接收付款。

当用户向 Siri 发出涉及应用扩展程序服务之一的请求时,SiriKit 会向扩展发送一个意向对象,该对象会描述用户的请求以及任何支持数据。 然后,应用扩展会为给定的意向生成适当的响应对象,详细说明扩展如何处理请求。

意向和意向 UI 扩展

Siri 和 Maps 应用通过两种不同类型的应用扩展与应用的服务进行交互:

  • 意向扩展 - 为 Siri 和 Maps 提供应用的内容,并执行满足任何受支持的意向所需的任务。
  • 意向 UI 扩展 - 提供将在 Siri 或 Maps 内显示应用内容的自定义 UI。

应用程序必须提供意向扩展来支持 SiriKit,它负责提供 Siri 和 Maps 可以向用户呈现的信息并处理意向。

创建意向 UI 扩展为可选项,因为 Siri 通常处理所有用户交互,并且具有标准的内置 UI,可在每个支持的域中呈现信息。 通过提供意向 UI 扩展,应用程序可以使用意向 UI 框架来呈现丰富的自定义用户界面,其中包含应用程序的品牌和附加信息。

Siri 和 Maps 应用角色

Siri 会对用户的口头请求进行语言处理和语义分析,从而将这些请求转换为意向扩展可以处理的可操作意向。

Maps 使用应用的意向扩展在地图界面中显示信息,以响应用户的操作。 例如请求附近的餐馆或获取应用中对餐馆的评价。

Siri 和 Maps 都使用标准系统界面管理用户的所有交互并显示结果。 应用扩展角色主要是为了提供显示的数据。 (可选)应用程序可以提供意向 UI 扩展并呈现自定义 UI 以完善默认系统界面。

通过 SiriKit 与 Siri 交互

本节将概述 SiriKit 如何允许用户使用 Siri 与应用程序交互。 在本示例中,我们将使用假的 MonkeyChat 应用程序:

The MonkeyChat icon

MonkeyChat 会保留自己的用户好友联系簿,每个好友都与一个屏幕名称相关联(例如 Bobo),并允许用户通过屏幕名称向每个朋友发送文本聊天。

用户可以通过多种方式启动与应用的交互,因为不同的用户可能会以许多不同的形式发出相同的请求。

例如,如果用户想要向好友 Bobo 发送消息,他们可能与 Siri 进行以下对话:

用户:嘿,Siri,发送一条 MonkeyChat 消息。
Siri:发送给谁?
用户:Bobo。
Siri:你想对 Bobo 说什么?
用户:请发送更多香蕉。

另一个人可能通过不同的对话发出相同的请求:

用户:在 MonkeyChat 上向 Bobo 发送消息。
Siri:你想对 Bobo 说什么?
用户:请发送更多香蕉。

另一个用户可能会发出更短的请求:

用户:MonkeyChat Bobo 请发送更多的香蕉。
Siri:收到,发送消息,在 Monkeychat 上向 Bobo 发送消息“请发送更多香蕉”。

用户还可以用不同的语言发出相同的请求:

用户:MonkeyChat Bobo s’il vous plaît envoyer plus de bananes。
Siri:Oui, envoi message s’il vous plaît envoyer plus de bananes à Bobo sur Monkeychat。

另一位用户的对话可能非常冗长:

用户:嘿,Siri,你能帮我一个忙吗?启动 MonkeyChat 应用程序并发送一条短信,其中包含消息“请发送更多香蕉”。
Siri:发送给谁?
用户:我最好的朋友 Bobo。

此外,Siri 可以通过多种方式响应请求,有些方法取决于请求的发出方式:

  • 按住“主页”按钮 - Siri 将提供更多的视觉响应,并提供有限的口头反馈。
  • “嘿,Siri” - Siri 将提供更多口头回答,并提供更少的视觉响应。

Siri 还经过调整,能够满足用户的辅助功能需求,并将根据这些需求进行交互和响应。

无论如何发出请求或 Siri 如何响应请求,Siri 都会处理与用户的对话,并且应用程序(通过其扩展)会提供功能。

当用户对 Siri 发出口头请求时,以下是 Siri 将遵循的步骤:

The steps that Siri will follow

  1. 首先,Siri 获取用户的语音音频并将其转换为文本。
  2. 接下来,将文本转换为意向,这是用户请求的结构化表示形式。
  3. 根据意向,Siri 将采取操作来执行用户的请求。
  4. 最后,Siri 将根据采取的操作向用户显示响应(视觉和口头)。

应用可以通过三种主要方式参与用户与 Siri 的对话:

The three main ways that the app can take part in the users conversation with Siri

  1. 词汇 - 应用程序借此告诉 Siri 与之交互所需的单词。
  2. 应用逻辑 - 这些是应用程序将根据给定意向采取的操作和响应。
  3. 用户界面 - 这是应用程序可以在其中给出响应的可选自定义用户界面。

示例

鉴于上述信息,请检查以下对话如何与 MonkeyChat 应用交互:

用户:嘿,Siri,在 MonkeyChat 上向 Bobo 发送一条消息。
Siri:你想对 Bobo 说什么?
用户:请发送更多香蕉。

该应用程序在对话的第一个作用是帮助 Siri 理解用户的语音:

Helping Siri understand the users speech

Siri 的数据库中没有“Bobo”这个名字,但该应用程序有,并且已经通过其词汇表与 Siri 共享了此信息。 该应用程序还可以帮助 Siri 识别 Bobo 是收件人,因为它将他们指定给 Siri 作为联系人

Siri 知道发送消息需要的不仅仅是收件人,因此它会快速检查应用扩展以查看消息是否需要内容。 由于 MonkeyChat 确实需要内容,Siri 就会使用来作为回答:“你想对 Bobo 说什么?

在上面的示例中,用户已回复“请发送更多香蕉”,Siri 会将这一回复捆绑到结构化意向中:

Siri will bundle the user's response into a structured Intent

结构化意向将包含以下信息:

  • 域:消息
  • 意向:sendMessage
  • 收件人:Bobo
  • 内容:请发送更多香蕉

每个域都有一组可以在其中执行的已知操作,并且基于域和操作,发送到应用程序的意向中可能包含零到多个参数。

然后系统会将意向发送到应用扩展进行处理。 对意向处理完毕后,应用程序将生成一个 IntentResponse,它将与意向捆绑在一起,其中包含描述应用程序对意向执行的操作的参数。

每个 IntentResponse 还将包含一个响应代码,用以告知 Siri 应用是否能够完成请求。 某些域包含非常具体的错误响应代码,也可以发送这些代码。

最后,IntentResponse 将包含一个 NSUserActivity(类似于用于支持转换的活动)。 如果响应要求他们离开 Siri 环境并进入应用程序来完成操作,则 NSUserActivity 将用于启动应用程序。

Siri 将自动构建相应的 NSUserActivity 来启动应用程序并从用户在 Siri 环境中离开的位置继续。 但是,如有需要,应用程序可以为其自己的 NSUserActivity 提供自定义信息。

应用程序处理意向并向 Siri 返回响应后,它会将结果呈现给用户(口头和视觉方式):

The results presented to the user both verbally and visually

Siri 为应用可用的每个域提供了多个内置响应用户界面。 然而,由于 MonkeyChat 提供了一个可选的意向 UI 扩展,因此它用于在上面的示例中向用户呈现对话的结果。

意向生命周期

处理意向时,应用扩展需要执行三个主要任务:

The Intent Lifecycle

  1. 应用必须解析事件上的每个参数。 因此,应用程序将多次调用解析(每个参数调用一次),有时对同一参数调用多次,直到应用程序和用户就所请求的内容达成一致。
  2. 应用必须确认它可以处理请求的意向,并告知 Siri 预期结果。
  3. 最后,应用必须处理意向并执行步骤来实现请求的结果。

解析阶段

解析阶段帮助 Siri 理解用户提供的值,并确保用户真正的意思是应用程序处理意向时会发生的情况。

此阶段还为应用程序提供了在与用户对话期间影响 Siri 行为的机会。 为此,应用将提供解决方案响应。 对于 Siri 理解的不同类型的数据,有许多预定义的响应。

应用程序的最常见的解析响应将是 Success,这意味着应用程序将参数(例如用户屏幕名称)中的特定数据与它所了解的信息进行匹配。

有时,应用需要确认给定请求是否与它掌握的正确信息片段相符。 在这些情况下,应用将发送一个 ConfirmationRequired 响应来向用户提出是非问答,例如“向 Bobo the Great 发送消息?

在某些情况下,应用可能需要用户从简短的选项列表中选择。 在这种情况下,应用将提供一个 Disambiguation 响应,其中包含供用户从中选择的列表,列表中有二到十个选项,例如:

Who do you want to message?

* Bobo the Great
* Bobo Jr.
* Little Bobo

Siri 将处理用户做出的选择,无论是使用语言还是通过与 Siri UI 交互,都会将结果发送回应用程序。

在其他情况下,应用程序可能没有足够的信息来解析参数,或者可能有太多匹配项需要使用消歧来解析(例如 80 个用户的名称中包含 Bobo)。 在这种情况下,应用将发送 NeedsMoreDetails 响应,Siri 将提示用户做出更具体的表达。

如果用户未提供处理意向所需的值,则应用可以发送 NeedsValue 响应,让 Siri 提示用户提供该值。

如果应用不支持用户为特定参数提供的值,则可以发送 UnsupportedWithReason 响应,借此提供值不受支持的原因。 然后,Siri 会提示用户输入一个全新的值,并向他们提供所需的原因。

最后,使用 NotRequired 响应告诉 Siri 应用不需要给定参数的值。 如果用户仍然提供了对应值,Siri 将直接忽略。

确认阶段

确认阶段有两个用途:

  • 告诉 Siri 处理意向的预期结果,以便 Siri 可以告诉用户将要发生什么。
  • 可在此阶段检查应用程序是否具备完成用户提出请求所需的任何必要状态,例如银行中的资金充足,能够支付请求的付款。

应用程序将在确认步骤中提供意向响应,该响应应尽可能多地包含应用程序可用的信息,以便 Siri 可以与用户有效地进行沟通。

根据域和操作类型,Siri 可能会提示用户进行确认,例如在发送付款或预订行程之前。

处理阶段

处理阶段是使用意向的最重要部分,因为这是应用通过执行被要求执行的任务来满足用户请求的阶段。

就像在“确认阶段”中所做的那样,应用需要尽可能多地提供有关结果的信息,以便 Siri 可以将此信息与用户关联。 有时,这些信息会以视觉方式呈现,有时 Siri 会简单地将其讲给用户听。

有时,应用程序可能需要额外的时间来处理给定的请求,例如网络调用延迟或现场人员需要完成请求(例如完成和运送订单或驾驶汽车到用户的位置)。 当 Siri 等待应用程序返回响应时,它会向用户显示等待 UI,告诉他们应用程序正在处理请求。

理想情况下,应用应在两到三秒内向 Siri 提供响应。 如果应用程序知道给定的响应将需要更长的时间来处理,则需要向 Siri 发送 InProgress 响应代码。 然后,Siri 会通知用户应用正在后台处理请求,即使他们离开 Siri 环境,应用也会继续执行此操作。

向应用添加 SiriKit

借助 iOS 10 中的 SiriKit,Apple 创建了两个新的扩展点:

  • 意向扩展 - 为 Siri 提供应用的内容,并执行满足任何受支持的意向所需的任务。
  • 意向 UI 扩展 - 提供将在 Siri 内显示应用内容的自定义 UI。

还有一个 API 可以向 Siri 提供单词和短语以帮助识别,其形式为:

  • 应用词汇 - 对于应用每个用户而言,常用的字词和短语。
  • 用户词汇 - 对于给定应用程序用户而言,唯一的单词和短语。

意向扩展

意向扩展负责处理应用和 Siri 之间的主要交互,如下所示:

The Intents Extension

意向扩展可以支持一个或多个意向,开发者可以决定如何在应用程序中实现 SiriKit。 开发人员还可以为需要处理的每个意向添加单独的意向扩展。 也就是说,Apple 要求开发人员限制意向扩展的数量,以便 Siri 不会针对该应用程序打开多个进程,因为处理多个进程需要更多内存和更长的时间。

开发人员还应注意,在 Siri 处于活动状态时,意向扩展将在后台运行。 这样,Siri 就可以主动与用户进行对话,同时仍与扩展通信以处理有关请求的信息。

隐私和安全注意事项

Apple 采取了强有力的措施,确保用户在使用 Siri 时私人信息的安全,因此,有多个交互需要用户在 iOS 设备上登录。 例如,请求乘坐或付款时。

此外,应用程序可能希望限制登录设备的用户的特定行为。 对于这些情况,应用可以请求“锁定时限制”行为。 需通过 Info.plist 文件中的设置完成此限制。

本地身份验证框架适用于意向扩展,因此应用可以请求用户提供其他身份验证信息,即使设备已解锁也是如此。

最后,Apple Pay 可用于意向扩展,因此应用程序可以使用 Apple Pay 完成交易,并且内置的 Apple Pay 表格将出现在 Siri 界面上方。

此外,Apple 希望确保用户知道何时向第三方应用发送信息,因此,用户在发出请求时必须说出应用程序的具体名称(如应用程序包的显示名称所述)。

Apple 设计了 Siri 来与用户进行自然流畅的对话,因此,应用程序包的名称可在语音中充当多种成分,只要它自然地符合用户的请求即可。

用户会做的常见事情之一是“动词化”应用程序的名称,也就是说,采用应用程序名称并将其用作请求中的动词。 例如,“MonkeyChat Bobo 那些香蕉很棒。

意向 UI 扩展

借助意向 UI 扩展,可将应用的 UI 和品牌融入 Siri 体验并使用户感觉已与应用建立连接。 通过此扩展,应用可以将品牌以及视觉信息和其他信息引入脚本。

Example Intents UI Extension output

意向 UI 扩展将始终返回一个 UIViewController,应用可以在视图控制器中添加它喜欢的任何内容,例如显示初始响应中不包含的附加信息。 意向 UI 还可以向用户更新长期事件的状态,例如共享汽车需要多长时间才能到达他们的位置。

意向 UI 扩展将始终与其他 Siri 内容一起显示,例如 UI 顶部的应用图标和名称,或者根据意向,按钮(如发送或取消)可能会显示在底部。

在某些情况下,应用程序可以替换 Siri 默认向用户显示的信息,例如消息或地图,应用程序可以将默认体验替换为针对应用程序定制的体验。

重要

虽然可以向意向 UI 扩展的 UIViewController 中添加交互式元素,例如 UIButtonsUITextFields,但这些都是严格禁止的,因为意向 UI 处于非交互式状态,用户将无法与它们交互。

应用可按需提供意向 UI 扩展,这是非必要项,因为 Siri 包含每个意向类型的默认 UI 集。 此外,意向 UI 接口仅适用于 Apple 认为对用户有帮助的某些意向。

添加 SiriKit 词汇

实现 SiriKit 的最后一步是在应用程序中提供所需的词汇。 许多应用程序都有向用户描述信息的独特方式以及用户向应用程序提供信息的独特方式。

因此,Siri 需要应用的帮助来了解应用特有的字词和短语。 其中一些短语将成为应用程序的一部分,以便每个用户知晓并理解。 还有一些短语对于应用程序的给定用户来说是独一无二的。

应用特定词汇

应用程序特定词汇定义了所有应用程序用户都知道的特定单词和短语,例如车辆类型或锻炼名称。 由于它们是应用程序的一部分,因此它们在 AppIntentVocabulary.plist 文件中被定义为主应用程序包的一部分。 此外,应对这些字词和短语进行本地化处理。

词汇 AppIntentVocabulary.plist 文件分为多个部分:

  • 应用程序使用示例 - 这些部分为用户可以对应用程序发出的请求提供一组常见用例。 例如:“使用 MonkeyFit 开始锻炼。
  • 参数 - 这些参数提供特定于应用的一组非标准参数类型。 例如,MonkeyFit 应用的锻炼名称。 其中包括:
    • 短语 - 允许应用定义应用的唯一术语。 例如:MonkeyFit 应用程序的“Bananarific”锻炼类型。
    • 发音 - 为 Siri 提供发音提示,作为给定短语的简单拼音拼写。 例如,“ba nana ri fic”。
    • 示例 - 提供在应用中使用给定短语的示例。 例如,“在 MonkeyFit 中启动 Bananarific”。

有关详细信息,请参阅 Apple 的应用词汇文件格式参考

用户特定词汇

用户特定词汇代表应用程序的各个用户特有的单词或短语。 运行时,主应用程序(而不是应用程序扩展)会将这些词汇作为一组有序术语提供,这些术语按用户的使用优先级由高到低排序,最重要的术语位于列表的开头。

查看上面显示的 MonkeyChat 应用示例。 MonkeyChat 保留所有用户联系人的列表,并将通过用户特定词汇将其发送给 Siri。 它还保留了一份列表,其中是最近与用户发生消息往来的 10 个联系人,并且为每个用户提供了一组“收藏”联系人。 对于本示例,收藏联系人应位于用户特定词汇的开头,后跟最近的联系人,然后是用户的其余联系人。

用户特定词汇支持以下类型的信息:

  • 联系人姓名。
  • 锻炼名称。
  • 相册名称。
  • 照片关键字。

如果应用程序使用 iOS 通讯簿,则应用程序无需采取任何操作,因为 Siri 已经可以使用此信息。 如果应用程序有自己独特的联系人数据库,则该应用程序仅需要提供联系人姓名。

设计词汇时,只提供用户了解和关注的必要值。 避免提供电话号码或电子邮件地址等信息。

当用户特定的词汇发生变化时,应用还需要及时更新 Siri。 用户习惯于在将应用添加到 iOS 设备后,立即使用 Siri 向其请求信息。 例如,如果用户在应用程序中添加新联系人,则在用户保存后,应用应立即将该信息发送给 Siri。

更重要的是,应用程序必须立即从 Siri 词汇表中删除信息,因为如果用户删除了一条信息,但 Siri 在几小时或几天后仍然可以识别出来,这可能会令用户感到心烦意乱。

重要

如果用户选择重置应用程序或注销,应用程序应从 Siri 中删除所有用户特定词汇。

SiriKit 权限

SiriKit 的最后一部分以权限为中心。 就像使用 iOS 的其他功能(例如照片、相机或联系人)一样,用户必须明确授予应用程序与 Siri 对话的权限。

该应用程序能够提供一个字符串,定义它将向 Siri 提供哪些信息,并给出用户应授予此访问权限的原因。

Apple 建议应用程序应在用户升级到 iOS 10 后首次打开应用程序时请求用户使用 Siri 的许可。 这样一来,用户就可以了解 Siri 集成,并可以在提出第一个请求之前预先批准使用。

SiriKit 和 Maps

SiriKit 是 iOS 的一个组成部分,并利用 iOS 10 中添加的更大的意向框架。 意向框架旨在与系统的其他部分共享常见和共享的操作和意向。

意向框架不仅仅是 Siri 集成,还提供其他功能,例如联系人集成,在这一集成中,应用程序可以成为特定联系人的默认电话或消息应用程序。 意向还提供与 CallKit 的深度集成,为用户提供最佳的 VOIP 体验。

iOS 10 中的 Maps 应用新增了拼车等功能,用户可以直接在地图 UI 内预订乘车。 SiriKit 为 Maps 提供了一个通用扩展点,因此可以在 Siri 和 Maps 之间共享拼车(和其他)意向。

这意味着,如果应用采用了 SiriKit 扩展,它还将免费获取 Maps 集成。

设计出色的 Siri 体验

将应用程序集成到 Siri 时设计出色的用户体验与设计出色的应用程序用户界面不同。 与用户直接在屏幕上与应用程序交互的正常情况不同,使用 Siri 时,很多时候根本看不到任何可视界面。 例如,用户使用“嘿 Siri”开启对话的情况。

Siri 如何帮助开发人员

在设计应用程序与 Siri 的交互时,应用程序将构建一个对话界面,这意味着上下文的来源为 Siri 代表应用程序与用户进行的对话。

在没有视觉参考的情况下,用户必须在脑海中牢记对话中的信息。 因此,Siri 只提供完成用户希望完成的任务所需的最少信息。

对话界面由对话期间用户和 Siri 提出的问题和响应组成。 因此,在设计这个界面时,考虑 Siri 如何提问和响应非常重要。

以下面的用户创建消息为例,Siri 可能会回答以下问题:“准备好发送了吗?”。 用户可以通过多种不同的方式进行响应,例如“发送”、“取消”或者甚至与该问题完全无关的内容。 无论对话如何开展,Siri 都会为应用程序进行处理,并且仅在相关信息可用时向其发送相关信息。

用户可以通过多种不同的方式启动与 Siri 的对话:

  • 拿起设备,按下主页按钮。 在这种情况下,Siri 将提供内容更丰富的可视化界面和更少的口头回应。
  • 通过说“嘿 Siri”并开启免提对话。 在这种情况下,Siri 会减少呈现的视觉信息,而更多地使用语言。
  • 使用辅助功能,例如支持蓝牙的助听器,在这种情况下,我们将为有特殊需求的用户量身定制 UI。
  • 使用 Car Play,在这一情况下,用户需要将干扰降到最低,从而集中驾驶。

开发人员如何帮助 Siri

将应用程序与 Siri 集成时,开发人员需要经常测试这种集成,并确保他们通过以尽可能多的不同方式请求相同的信息或任务来发出许多不同的请求。

由于想法因人而异,因此开发人员必须尽可能多地邀请不同的 beta 测试员加入,以帮助微调 Siri 集成。 用户可能会以开发人员从未想到的方式索取信息或提出请求,这种微调可以帮助确保最广泛的用户群体在使用 Siri 的应用程序时获得良好的体验。

在不同情况和环境下进行测试。 以各种可能的方式启动与 Siri 的对话,以确保这些对话保持流畅和自然。 在用户很可能使用该应用程序的地方进行测试,例如在拥挤的健身房。

确保应用程序提供 Siri 所需的所有信息,以便向用户正确表示请求和结果。 在免提情况下使用 Siri 时,更要这样做。

Siri 设计准则

请始终记住,Siri 是代表应用程序与用户进行对话。 开发人员希望确保这种对话尽可能流畅和自然。

正如任何重要对话一样,开发人员需要确保以下事项:

  • 应用已准备好开展对话。
  • 应用程序会准确地辨别出用户想要完成的任务。
  • 应用在适当的时间提出适当的问题。
  • 应用程序使用用户正在寻找的信息来响应请求。

准备对话

首先要记住的是,应用程序的用户不会与开发人员完全相同。 他们可能拥有不同的背景,讲不同的语言,或者在使用应用程序时有特殊的需求。

此外,由于应用程序是由开发人员设计和构建,因此开发人员对应用程序及其内部工作原理和功能有深入而详尽的了解,而一般用户并不满足这一点。 因此,开发人员向 Siri 发出的请求可能与普通用户不同。

这就是让尽可能多的人通过 Siri 与应用程序交互至关重要的原因。 用户可能会通过 Siri 向应用程序提出开发者从未想到过的请求,或者以开发者未曾考虑过的方式提出请求。

确保应用是“良好的倾听者”

开发人员需要确保应用程序是一个良好的倾听者,并获取满足用户期望的对话细节。 但也有可能出现以下情况,即他们没有提供应用程序完成请求的任务所需的所有信息。

应用可以通过多种方式处理这种情况:

  • 为缺失值选择一个好的默认值 - 例如,如果用户没有指定他们想要从哪里乘车,则拼车应用程序可能会默认将位置设为用户的当前位置。
  • 进行有根据的猜测 - 通过使用应用程序收集的用户特定信息,应用程序可能能够对丢失的信息进行有根据的猜测,例如根据用户的联系信息填写缺失的手机号码。 但是,应注意避免出现意外情况,例如选择最昂贵的选项等。
  • 提示更多信息 - 应用程序可以让 Siri 提示用户输入缺失的值。 然而,这里的关键是保持对话简单明了。 如果用户必须回答几个问题才能实现他们的请求,他们很快就会感到沮丧。
  • 妥善处理错误信息 - 用户可能会提供应用程序预期之外的值或在给定上下文中无法处理的值。 确保应用程序以明确且易于更正的方式将这种情况与用户联系起来。

当应用程序面临可以用单个值解决的不确定问题时,处理此问题的首选方法是让 Siri 要求用户予以确认。 例如,“您是指 Bobo the Great 吗?”,对于这类问题,用户可以用简单的答案(是或否)来回复。

然而,对于单个值而言,如果存在多个可行选项且这些选项都准确无误,则首选方法是消除歧义。 在这种情况下,Siri 最多可以提示用户选择 10 个选项。 例如:

Who do you want to send the message to?

* Bobo the Great!
* Bobo Jr.
* Little Bobo

如果应用仍不确定,请让 Siri 提示用户针对给定值提供全新的、更具体的答案。

请求最终确认

在应用实际执行任务以完成用户的请求之前,Siri 将检查应用扩展以确保一切已准备就绪。 例如,用户帐户中的资金是否足够支付请求的付款?

此外,应用程序需要确保向 Siri 提供所有可能的信息,以便 Siri 可以将其呈现给用户并确认即将执行的任务满足他们的期望。

在用户确认了请求并且应用程序执行了该请求后,应用程序需要再次确保其已向 Siri 返回所有结果,以便 Siri 可以将这些结果与用户相关联。

响应请求

Siri 为它所了解的每个域和操作都提供了多个内置用户界面。 但是,在合适的情况下,应用程序可以提供自定义意向 UI 扩展,通过呈现应用程序的品牌和 UI 或比请求中提供的更多信息来丰富用户体验。

也就是说,在为 Siri 设计自定义界面时应该保持克制。 通常来说,用户希望尽快完成特定任务,并且不希望过多地接收不必要的信息。

还应注意确保自定义 UI 在所有不同的 iOS 设备以及用户可能拥有或正在使用该设备的方向上都能正确显示和作出响应。

请在适当的情况下使用 SiriKit API 隐藏默认 Siri UI 中已存在的任何冗余信息。 但请确保该应用程序仍在向 Siri 提供信息,以便 Siri 可以在免提情况下,以语音形式呈现该信息。

在某些情况下,Siri 可能会启动应用程序来满足用户的请求,例如显示用户请求的照片。 在这些情况下,不要惊扰用户。 在无需执行中间步骤或进一步交互的情况下显示预期信息。 切勿显示用户不期望的信息或执行用户不期望的任务。

优化设计

Apple 建议采取几个步骤来完善对话界面的设计。 首先,向 Siri 提供清晰、简洁的词汇和用例。

用户发现应用程序的方法之一是与 Siri 发起对话并询问“你能做什么?”Siri 将展示其可执行的多项操作,包括开发人员的应用程序以及它通过其 plist 文件提供的主用例示例。

如何编写良好的示例用例:

  • 确保示例包含应用名称。
  • 保持示例简短、切中要点。
  • 为应用支持的每个意向提供多个示例。
  • 根据应用程序最常见的用例,对意向及其中的示例进行优先级排序。
  • 确保应用提供本地化的示例。
  • 确保给出的每个示例在应用程序中按预期运行。
  • 避免在示例中提及 Siri,因此不要包含“嘿 Siri...”之类的文字
  • 避免任何不必要的寒暄,例如“”或“谢谢”。

花适当的时间来探索和试验应用程序如何塑造 Siri 代表其与用户进行的对话。 确保在整个过程中与典型用户交谈,因为他们与应用程序的交互和对应用程序的期望可能会随着时间的推移而改变。

请务必记住在不同情况下测试应用程序以及调用 Siri 对话的所有不同方法。 在用户可能使用该应用程序的真实位置进行测试,远离办公室和办公桌。

尽可能地让与 Siri(代表应用程序)开展的对话流畅、自然并且让用户感觉“恰到好处”。

总结

本文介绍了使用 SiriKit 所需的关键概念,并展示了它可以与 Xamarin.iOS 应用交互,以提供用户可以在 iOS 设备上使用 Siri 和 Maps 应用访问的服务。