iOS 11 中的 SiriKit 汇报
SiriKit 是在 iOS 10 中引入的,许多服务域 (包括锻炼、乘车预订和) 拨打电话。 有关 SiriKit 的概念以及如何在应用中实现 SiriKit,请参阅 SiriKit 部分。
iOS 11 中的 SiriKit 添加了以下新的和更新的意向域:
- 列表和注释 - 新增功能! 为应用提供用于处理任务和笔记的 API。
- 可视代码 - 新增功能! Siri 可以显示 QR 码来共享联系信息或参与付款交易。
- 付款 - 为付款交互添加了搜索和转移意向。
- 行程预订 - 添加了取消行程和反馈意向。
其他新功能包括:
- 备用应用名称 – 提供别名,通过提供备用名称/发音,帮助客户告知 Siri 以你的应用为目标。
- 开始锻炼 – 提供在后台开始锻炼的功能。
下面介绍了其中一些功能。 有关其他内容的详细信息,请参阅 Apple 的 SiriKit 文档。
列表和备注
新的列表和笔记域为应用提供了一个 API,用于通过 Siri 语音请求处理任务和笔记。
任务
- 具有标题和完成状态。
- (可选)包括截止时间和位置。
备注
- 具有标题和内容字段。
任务和笔记都可以组织成组。 本部分的其余部分介绍如何使用 TasksNotes SiriKit 示例通过 SiriKit 实现此新域。
如何处理 SiriKit 请求
按照以下步骤处理 SiriKit 请求:
- 解决 – 验证参数,并根据需要 () 请求用户进一步的信息。
- 确认 - 最终验证和验证是否可以处理请求。
- 句柄 – (更新数据或) 执行网络操作。
前两个步骤是可选的 (尽管建议) ,但最后一个步骤是必需的。 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 应用执行以下步骤:
- 在 Entitlements.plist 中勾选 SiriKit。
- 将 “隐私 - Siri 使用情况说明” 密钥添加到 Info.plist,以及为客户发送的消息。
INPreferences.RequestSiriAuthorization
在应用中调用 方法,提示用户允许 Siri 交互。- 在开发人员门户上将 SiriKit 添加到应用 ID,然后重新创建预配配置文件以包含新权利。
然后,将新的扩展项目添加到应用以处理 Siri 请求:
- 右键单击解决方案,然后选择 “添加 > ”“添加新项目...”。
- 选择 “iOS > 扩展 > 意向扩展 ”模板。
- 将添加两个新项目: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函数:
- 处理意向 - Siri 分析的数据在特定于意向类型的对象中
intent
可用。 你的应用可能已使用可选Resolve*
方法验证了该数据。 - 验证和更新数据存储 - 使用应用组将数据保存到文件系统 (,以便main iOS 应用也可以) 或通过网络请求访问它。
- 提供响应 – 使用
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 文件:
设置备用应用名称后,以下短语也适用于实际命名为 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 并下载预配配置文件。