Shortcuts快速入门

本文主要介绍一些 SiriKit 的基本用法,以及如何创建 Shortcuts

Shortcuts 就是能够让用户自定义一段语音 (Phase) 或识别用户的语音短语,用户说出这个短语,可以执行既定的逻辑。

Shortcuts 是 SiriKit 的一部分,是原有 SiriKit API 的扩展, 用户可以通过 Siri 指令,执行 App 内的一系列逻辑,Shortcuts 本身的指令需要足够简洁,Shortcuts 在设计时应该足够的简洁,能够满足用户的目的,经常能被经常使用,并且易于记住。

Shortcuts 不是 SiriKit 中抽象的 Intent , 举例来说 Intent 描述了一种用户的抽象意图,比如「订电影票」,但一种具体的用户意图是「在最近电影院订 3 张『侏罗纪公园2』的电影票」,Shortcut 就是指代这种具体的用户意图。Shortcut 最终是让用户可以利用 Siri 快速执行这种可重复的具体意图

首先简介一些 SiriKit 的基本用法

  • 使用 SiriKit 需要在项目中先新建一个 Intent Extension的 target,如果需要自己定 Siri 中的交互视图,还需要创建 Intent UI 的 Extension ,分别负责处理 Intent 的业务逻辑 和 Intent 的视图;

  • 新建 Intent Definition File

  • 在 Intent Definition File 新建 Intent , 会自动生成对应 Intent 的类文件, 在类文件中,会关联你声明的 parameter 为类的属性,有关这种文件的具体用法,下文中会结合实例说明。

  • SiriKit 的核心是 Intent , 也就是一种自然语言的描述,描述了用户的意图;使用 SiriKit 并不需要实现具体的自然语言解析,你只需要按照正常语言描述即可,说明一句话中需猜想的参数, Intent Definition 和 Handler 也告诉 Siri 如何来解析、处理和推测用户意图,以及根据上下文在合适的时机向用户推荐这些 Intent 。Intent 的生命周期分为:Resolve - Confirm - Handle ,比如 Siri 中的发消息这种 Intent(System Intent), Inetnt 描述了收件人、消息内容等,同时需要在 IntentHandler 中解析和纠错收件人和消息内容(resolve),确认用户的操作(confirm),之后将消息发送出去(handle);再比如 Clock 的计时器的 Intent,描述了用户说「计时70分钟」所想要设定的计时器中哪些部分是具体的变量,哪些是单位(resolve),以及如何转化为对应计时器的响应(handle);滴滴做的 Intents ,通过语言解析出目的地(resolve) ,用户确认价格(confirm),最终帮助用户叫到车(handle)。SiriKit 在 iOS10 中推出.

  • 以调用 App 发送信息为例 ,IntentHandler 类会遵循 INSendMessageIntentHandling 协议,实现以下四个方法,对 Siri 的事件进行异步处理,每个 block 中的 Result(主要包括一些内容矫正的方法) 或 Response(主要含有一个 NSUserActivity 的属性) 参数中包含了实际的处理


func resolveRecipients(for intent: INSendMessageIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void)  // 处理接收人 - Resolve
func resolveContent(for intent: INSendMessageIntent, with completion: @escaping (INStringResolutionResult) -> Void)  // 处理信息内容 - Resolve
func confirm(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) // 确认的操作 - Confirm
func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) // 发送信息 - Handle

基于 Shortcut 的行为来决定实现方法

  • 如果是打开 App 特定页面,跳转到 App 内用户继续完成一些操作,在 Spotlight 结果中复现已经索引的内容,或者提供 Handff 操作,这种情况的 Shortcut 推荐使用 NSUserActivity 来实现,只需修改 userActivity 的新属性 isEligibleForPrediction ,并向 viewcontroller 的 userActivity 属性赋值即可完成 donate

  • 如果用户无需跳转到 App 内,通过 Siri 语音或者自定义的 Siri 展示界面即可响应用户需求(使用 Siri Intent Extension Target 响应),推荐使用 Intents , 当然 Intent 也可以实现跳转到 App

创建 Shortcuts 的三个步骤

1.Declare Shortcut - 声明 Shortcut

2.Donate Shortcut - 向 iOS 告知自己的 Shortcut

3.Handle Shortcut - 处理对应的 Shortcut 的实际响应

使用 NSUserActivity 实现 Shortcut

使用这种该方法首先要在项目的 Info.plist 文件中, 声明一个新的 user activity type,例如:

<key>NSUserActivityTypes</key> <array>
<string>com.myapp.name.my-activity-type</string> </array>

步骤一:Declare Shortcut :声明新的 NSUserActivity 如同以往, 要支持 Shortcuts 只需声明一个新属性 isEligibleForPrediction 为 true, 如下

let userActivity =  NSUserActivity(activityType: "com.myapp.name.my-activity-type")
userActivity.isEligibleForSearch= true
userActivity.isEligibleForPrediction = true // 新属性,赋值为 true 后可以暴露给 `SiriKit`
userActivity.title = "Activity的显示标题"
userActivity.userInfo = ["key": "value"]
userActivity.suggestedInvocationPhrase = "一些推荐的建议"

let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
let image = UIImage(named: "myImage")!
attributes.thumbnailData = image.pngData()
attributes.contentDescription = "Activity 的副标题"
userActivity.contentAttributeSet = attributes

viewController.userActivity = userActivity // 赋值之后,这条 UserActivity 就被 donate 了

步骤二:Donate Shortcut :将新建的 NSUserActivity 对象赋值给 viewController 的 userActivity 属性即可完成 donate,如上

步骤三:Donate Shortcut :在Siri 唤起 App 时,在 Appdelegate 中处理通过 UserActivity 相关的信息,如下

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
if userActivity.activityType == "com.myapp.name.my-activity-type" {
// 匹配 activity 的种类
}
if interaction = userActivity.interaction {
// 处理 Siri 所告知的相关信息
}
// 根据已知信息,跳转到用户所需页面,或恢复一些场景
}
使用 Intents 来创建 Shortcut

这里将借助苹果提供的 Siri Shortcuts 的 Demo 来进行讲解(文章末尾有demo地址)

这个 Demo 中的结构是,App 与 Intent 共用了一部分业务代码,也就是处理「汤」的一部分逻辑,这部分封装为SoupKit.framework , 这样做可以复用代码,因为 Intent 有单独执行的能力,也会用到「汤」的相关逻辑。SoupChef 是 App 的 target ;SoupChefIntents 这个 target 处理了 Siri Intents 的实际 Handler;SoupChefInetntsUI 处理自定义的 Siri 响应视图;SoupKit包含了共用的「汤」的逻辑,具体逻辑见下图,苹果希望我们使用这种方式来组织我们的 App ,复用更多代码

这里写图片描述

图1

步骤一:Declare Shortcut

新建一个 Intent
这里写图片描述

图2

Intent Definition File 选择不在主项目中生成相关类,避免符号表冲突

这里写图片描述

图3

在Intent Definition File 中声明如图中的字段,具体作用在图中注明

这里写图片描述

图4

编辑后在编译对应的 target 时会自动生成对应的$(name)Intent.swift文件,这个 intent 被关联到 SoupKit 中,所以编译 SoupKit 时会生成如下文件

这里写图片描述
图5

然后在 Intent Definition 中进一步声明相关的 Response

这里写图片描述
图6

编译时会自动生成,对应的IntentResponse

这里写图片描述
图7

通过以上步骤,就完成了声明一个 Siri Intent ,这个 Intent 描述了用户向 Siri 说 ‘Order Soup’ 的时候响应

步骤二:Donate Shortcut

结合订餐这个场景, 每次在用户订完餐后,可以告知 Siri 一个新的 Intent,每次订餐成功后,自己新建一个 Intent 对象,并调用 donate() 方法, 具体代码如下,这种方式 donate 后,用户可以在设置 - Siri 中看到这个 Shortcut ,并且在 Spotlight 的推荐中也会出现这个 Shortcut

这里写图片描述
图8

Shortcuts 的一大新特性是用户自定义语音,这样的话,用户可以使用自己喜欢的语音指令来完成订餐操作,比如「来碗蛤蜊汤」,如果想要在 App 内让用户自定义语音命名一个 Shortcut,可以通过 Present INUIAddVoiceShortcutViewController 实例来实现,具体方法如下

这里写图片描述
图9

App 内唤起 新建和编辑 Shortcut 的Controller 会显示如下效果,此时用户可以将对应 Shortcut 自定义语音保存到 iOS 内

这里写图片描述
图10

这里写图片描述
图11

在新版的 iOS12 调试中,在 Developer 中开启相关选项,在锁屏和 spotlight 搜索界面显示上一次的 Shortcuts 指令,不需要一遍遍语音调试 Siri

这里写图片描述
图12

设置好之后, 在手机上就可以看到这个,第一次需要使用 Siri 语音试一次,之后就可以在 Spotlight 和 锁屏界面出现

这里写图片描述
图13

在OrderDetail Controller 中,有相关 NSUserActivity 的相关信息,只需将 iOS12 的新增的属性赋值为了 isEligibleForPrediction = true,就可以直接 donate NSUserActivity 类的 Shortcuts, 也就是上面图片中的 第二个选项

步骤三:Donate Shortcut

Intent 最终都需要通过INExtension 的子类来进行回调,最终会通过以下方法进入到你的代码中

这里写图片描述
图14

之后,你就可以进行 Intent 中进一步的处理, 该 Intent 实际为 OrderSoupIntent ,会包含 soup、quantity、options 等属性,调试时,可以直接将 Siri Intent Extension 也就是 SoupChefIntents 这个 target 编译到手机上,并选择 Siri 为运行对象,就可以只调试 Handler 相关逻辑,而不运行 App

这里写图片描述
图15

调试效果如下,有关 Intent 的 handler ,可以参考 demo 中的具体代码

这里写图片描述
图16

自此完成了 Intent 的 Declare 、Donate 、Handle.

相关地址

  • WWDC 2018 Introduction to Siri Shortcuts :

https://developer.apple.com/videos/play/wwdc2018/211/

  • Documentation for SiriKit :

https://developer.apple.com/documentation/sirikit

  • Shortcuts demo

介绍:
https://developer.apple.com/documentation/sirikit/accelerating_app_interactions_with_shortcuts

下载地址:
https://docs-assets.developer.apple.com/published/b2d1b84aff/AcceleratingAppInteractionsWithShortcuts.zip

猜你喜欢

转载自blog.csdn.net/Philm_iOS/article/details/81202874