iOS 11 中的 SiriKit 汇报

SiriKit 是在 iOS 10 中引入的,许多服务域 (包括锻炼、乘车预订和) 拨打电话。 有关 SiriKit 的概念以及如何在应用中实现 SiriKit,请参阅 SiriKit 部分。

Siri 任务列表演示

iOS 11 中的 SiriKit 添加了以下新的和更新的意向域:

  • 列表和注释 - 新增功能! 为应用提供用于处理任务和笔记的 API。
  • 可视代码 - 新增功能! Siri 可以显示 QR 码来共享联系信息或参与付款交易。
  • 付款 - 为付款交互添加了搜索和转移意向。
  • 行程预订 - 添加了取消行程和反馈意向。

其他新功能包括:

  • 备用应用名称 – 提供别名,通过提供备用名称/发音,帮助客户告知 Siri 以你的应用为目标。
  • 开始锻炼 – 提供在后台开始锻炼的功能。

下面介绍了其中一些功能。 有关其他内容的详细信息,请参阅 Apple 的 SiriKit 文档

列表和备注

新的列表和笔记域为应用提供了一个 API,用于通过 Siri 语音请求处理任务和笔记。

任务

  • 具有标题和完成状态。
  • (可选)包括截止时间和位置。

备注

  • 具有标题和内容字段。

任务和笔记都可以组织成组。 本部分的其余部分介绍如何使用 TasksNotes SiriKit 示例通过 SiriKit 实现此新域。

如何处理 SiriKit 请求

按照以下步骤处理 SiriKit 请求:

  1. 解决 – 验证参数,并根据需要 () 请求用户进一步的信息。
  2. 确认 - 最终验证和验证是否可以处理请求。
  3. 句柄 – (更新数据或) 执行网络操作。

前两个步骤是可选的 (尽管建议) ,但最后一个步骤是必需的。 SiriKit 部分提供了更详细的说明。

解析和确认方法

这些可选方法允许代码执行验证、选择默认值或向用户请求其他信息。

例如,对于 IINCreateTaskListIntent 接口,所需的方法是 HandleCreateTaskList。 有四种可选方法可提供对 Siri 交互的更多控制:

  • ResolveTitle – 验证标题、设置默认标题 ((如果适用) ),或指示不需要数据。
  • ResolveTaskTitles – 验证用户说出的任务列表。
  • ResolveGroupName – 验证组名称,选择默认组,或指示不需要数据。
  • ConfirmCreateTaskList – 验证代码是否可以执行请求的操作,但不执行该操作 (只有 Handle* 方法应修改数据) 。

处理意向

列表和备注域中有六个意向,三个用于任务,三个用于注释。 要处理这些意向,必须实现的方法是:

  • 对于任务:
    • HandleAddTasks
    • HandleCreateTaskList
    • HandleSetTaskAttribute
  • 有关说明:
    • HandleCreateNote
    • HandleAppendToNote
    • HandleSearchForNotebookItems

每个方法都有一个传递给它的特定意向类型,其中包含 Siri 从用户请求 (分析的所有信息,并且可能在) 和 Confirm* 方法中Resolve*更新。 你的应用必须分析提供的数据,然后执行一些操作来存储或以其他方式处理数据,并返回 Siri 说出并向用户显示的结果。

响应代码

必需 Handle* 和可选 Confirm* 方法通过在对象上设置值来指示响应代码,这些对象传递给其完成处理程序。 响应来自 INCreateTaskListIntentResponseCode 枚举:

  • Ready – 在确认阶段返回 (即。 Confirm* 来自 方法,但不是从 Handle* 方法) 。
  • InProgress - 用于长时间运行的任务 (,例如网络/服务器操作) 。
  • Success – 仅使用 Handle* 方法) (成功操作的详细信息进行响应。
  • Failure – 表示发生错误,操作无法完成。
  • RequiringAppLaunch – 无法通过意向进行处理,但可以在应用中执行该操作。
  • Unspecified – 不使用:将向用户显示错误消息。

有关这些方法和响应的详细信息,请参阅 Apple 的 SiriKit 列表和说明文档

实现列表和注释

TasksNotes SiriKit 示例是使用以下步骤创建的,用于将 SiriKit 支持添加到空白 iOS 应用。

首先,若要添加 SiriKit 支持,请为 iOS 应用执行以下步骤:

  1. Entitlements.plist 中勾选 SiriKit
  2. “隐私 - Siri 使用情况说明” 密钥添加到 Info.plist,以及为客户发送的消息。
  3. INPreferences.RequestSiriAuthorization在应用中调用 方法,提示用户允许 Siri 交互。
  4. 在开发人员门户上将 SiriKit 添加到应用 ID,然后重新创建预配配置文件以包含新权利。

然后,将新的扩展项目添加到应用以处理 Siri 请求:

  1. 右键单击解决方案,然后选择 “添加 > ”“添加新项目...”
  2. 选择 “iOS > 扩展 > 意向扩展 ”模板。
  3. 将添加两个新项目:Intent 和 IntentUI。 自定义 UI 是可选的,因此此示例仅包含 意向 项目中的代码。

扩展项目是处理所有 SiriKit 请求的位置。 作为单独的扩展,它不会自动与main应用通信 - 这通常是通过使用应用组实现共享文件存储来解决的。

配置 IntentHandler

IntentHandler 是 Siri 请求的入口点 - 每个意向都传递给 GetHandler 方法,该方法返回一个可以处理请求的对象。

下面的代码演示了一个简单的实现:

[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
  protected IntentHandler(IntPtr handle) : base(handle)
  {}
  public override NSObject GetHandler(INIntent intent)
  {
    // This is the default implementation.  If you want different objects to handle different intents,
    // you can override this and return the handler you want for that particular intent.
    return this;
  }
  // add intent handlers here!
}

类必须继承自 INExtension,并且由于示例将处理列表和注释意向,因此它还实现了 IINNotebookDomainHandling

注意

  • .NET 中存在一个以大写 I作为前缀的接口的约定,Xamarin 在从 iOS SDK 绑定协议时会遵循该约定。
  • Xamarin 还保留 iOS 中的类型名称,Apple 使用类型名称中的前两个字符来反映类型所属的框架。
  • Intents对于框架,类型带有IN* (前缀,例如 INExtension) 但不是接口。
  • 此外,在 C#) 中成为接口的协议 (最终会得到两 I个 ,例如 IINAddTasksIntentHandling

处理意向

每个意向 (添加任务、设置任务属性等) 在类似于下面所示的单个方法中实现。 方法应执行三个main函数:

  1. 处理意向 - Siri 分析的数据在特定于意向类型的对象中 intent 可用。 你的应用可能已使用可选 Resolve* 方法验证了该数据。
  2. 验证和更新数据存储 - 使用应用组将数据保存到文件系统 (,以便main iOS 应用也可以) 或通过网络请求访问它。
  3. 提供响应 – 使用 completion 处理程序将响应发送回 Siri,以便向用户读取/显示:
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
  var list = TaskList.FromIntent(intent);
  // TODO: have to create the list and tasks... in your app data store
  var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
  {
    CreatedTaskList = list
  };
  completion(response);
}

请注意, null 作为第二个参数传递给响应 - 这是用户活动参数,如果未提供,将使用默认值。 只要 iOS 应用通过 Info.plist 中的密钥支持它,NSUserActivityTypes就可以设置自定义活动类型。 然后,可以在打开应用时处理这种情况,并执行特定操作 (例如打开相关视图控制器,以及从 Siri 操作) 加载数据。

该示例还对结果进行 Success 硬编码,但在实际方案中,应添加适当的错误报告。

测试短语

以下测试短语应适用于示例应用:

  • “在 TasksNotes 中使用苹果、香蕉和梨制作杂货清单”
  • “在 TasksNotes 中添加任务 WWDC”
  • “将任务 WWDC 添加到 TasksNotes 中的训练列表”
  • “在 TasksNotes 中将参加 WWDC 标记为已完成”
  • “在任务笔记提醒我买 iphone 当我回家”
  • “在 TasksNotes 中将购买 iPhone 标记为已完成”
  • “提醒我早上 8 点离开家,在 TasksNotes”

创建新的列表示例将任务设置为完整示例

注意

与早期版本) 不同,iOS 11 模拟器支持使用 Siri (进行测试。

如果在真实设备上进行测试,请不要忘记为 SiriKit 支持配置应用 ID 和预配配置文件。

备用名称

这项新的 iOS 11 功能意味着你可以为应用配置备用名称,以帮助用户使用 Siri 正确触发它。 将以下键添加到 iOS 应用项目的 Info.plist 文件:

显示替代应用名称键和值的 Info.plist

设置备用应用名称后,以下短语也适用于实际命名为 TasksNotes) 的示例应用 (:

  • “在 MonkeyNotes 中使用苹果、香蕉和梨制作杂货清单”
  • “在 MonkeyTodo 中添加任务 WWDC”

疑难解答

运行示例或将 SiriKit 添加到自己的应用程序时可能会遇到的一些错误:

NSInternalInconsistencyException

Objective-C 引发异常。 名称:NSInternalInconsistencyException 原因:使用类 <INPreferences: 0x60400082ff00> 来自应用需要权利 com.apple.developer.siri。 是否在 Xcode 项目中启用了 Siri 功能?

  • SiriKit 在 Entitlements.plist 中勾选。

  • Entitlements.plist“项目选项生成 > iOS 捆绑签名”>中配置。

    显示正确设置权利的项目选项

  • (设备部署) 应用 ID 已启用 SiriKit 并下载预配配置文件。