SiriKit框架详细解析(七) —— 构建Siri Shortcuts简单示例(一)

1,921 阅读10分钟
原文链接: www.jianshu.com

版本记录

版本号 时间
V1.0 2018.12.06 星期四

前言

大家都知道随着人工智能的发展,会掀起来另外一个工业革命,而语音识别就是人工智能的初始阶段,但是每个公司做的都不一样,涉及到一系列的语音的采集和算法实现,苹果的Siri就是业界语音识别的代表性的产品。接下来的几篇我们就详细解析一下SiriKit这个框架。感兴趣的可以看下面几篇文章。
1. SiriKit框架详细解析(一)—— 基本概览(一)
2. SiriKit框架详细解析(二)—— 请求授权使用SiriKit和INPreferences类(一)
3. SiriKit框架详细解析(三)—— 创建Intents App扩展(一)
4. SiriKit框架详细解析(四)—— 构建代码以支持App扩展和将意图调度到处理对象(一)
5. SiriKit框架详细解析(五) —— 编程指南之Intents和Intents UI扩展(一)
6. SiriKit框架详细解析(六) —— 编程指南之确认和处理请求、指定自定义词汇表和界面(一)

开始

首先看一下写作环境

Swift 4.2, iOS 12, Xcode 10

在这个iOS 12教程中,您将学习如何为应用程序构建Siri快捷方式(Siri Shortcuts)并出现在Spotlight中,以及用您的声音命令Siri。

如果你有iPhone,你可能会与Siri互动。 当Siri于2011年first announced时,无论使用何种语句的具体组合,其理解内容和意义的能力都是开创性的。

不幸的是,在2016年SiriKit发布之前,Siri集成仅限于Apple自己的应用程序。即便如此,您可以使用Siri进行的事情类型仅限于一组特定的域。

随着iOS 12中Siri Shortcuts的发布,情况已不再如此。 现在,您可以创建自定义意图(intents)来表示任何域(domain),并且您可以将应用程序的服务直接公开给Siri。

在本教程中,您将学习如何使用这些新的快捷方式API将Siri集成到编写应用程序中。

要开始使用,请使用已打开的入门项目。双击TheBurgeoningWriter.xcodeproj以在Xcode中打开项目。

注意:如果可能,您应该使用物理设备来学习本教程。 虽然模拟器可以工作,但它在某些方面表现不同。

bundle ID设置为您独有的(Apple建议使用反向DNS名称,例如com.xxx.TheBurgeoningWriter)。 然后,运行应用程序,您将看到显示所有已写好文章的主屏幕。 从这里,您可以添加新文章并发布您之前保存的草稿。

这里的一个重要想法是写一篇文章,稍微坐一会儿,然后稍后发布 - 只要你对它感到满意。

准备开始了吗? 很好!


Adding Shortcuts to an App

首先要考虑的是您的应用程序的哪些功能适合转换为快捷方式。

理想情况下,您应该为用户可以执行的操作创建快捷方式;最好是他们可能反复做的事情。 一旦您决定设置快捷方式,有两种方法可以创建它:

  • NSUserActivity:用户活动是现有API的一部分,允许您公开用户可以为应用程序切换和Spotlight搜索执行的某些操作。 这里要记住的是,只有当您希望用户从Siri进入您的应用程序去完成任务时,此选项才有用。
  • Custom Intents:创建自定义意图是快捷方式的真正威力。 有意图(intent),您可以通过Siri与您的用户进行通信,而无需打开您的应用程序。

Making a Shortcut for Writing New Articles

您的第一个快捷方式是允许用户直接进入新文章页面的快捷方式。 这是基于NSUserActivity对象创建快捷方式的最佳选择,因为它会将Siri的用户带入您的应用程序。

您的目标是每次用户执行该操作时将其中一个活动发送给系统。 您可以通过添加一个允许生成这些活动对象的新方法来实现。

打开Article.swift,并在import下的文件顶部添加以下常量字符串定义:

public let kNewArticleActivityType = "com.razeware.NewArticle"

这是您将用于确定您是否正在处理new article快捷方式的标识符。 一个好的经验法则是在为快捷方式选择标识符时使用反向DNS约定。

接下来,在属性下面添加以下方法定义:

public static func newArticleShortcut(thumbnail: UIImage?) -> NSUserActivity {
  let activity = NSUserActivity(activityType: kNewArticleActivityType)
  activity.persistentIdentifier = 
    NSUserActivityPersistentIdentifier(kNewArticleActivityType)

  return activity
}

在这里,您将使用正确的标识符创建一个活动对象并将其返回。persistentIdentifier将所有这些快捷方式连接为一个活动。

为了使您的活动有用,您必须进行一些配置。

return之前添加以下两行:

activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true

首先,将isEligibleForSearch设置为true。 这允许用户在Spotlight中搜索此功能。 然后,将isEligibleForPrediction设置为true,以便进行预测。 将此设置为true允许Siri查看活动并在将来向您的用户建议。 它也是允许活动稍后变为快捷方式的原因。

接下来,您将设置影响快捷方式对用户的显示方式的属性。

定义本地属性属性。 将其添加到以前粘贴的行下方:

let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)

通过添加以下行来设置属性:

activity.title = "Write a new article"
attributes.contentDescription = "Get those creative juices flowing!"
attributes.thumbnailData = thumbnail?.jpegData(compressionQuality: 1.0)

这将设置您在建议通知中看到的标题,副标题和缩略图。

退一步,重要的是要记住Siri以两种不同的方式暴露这个功能:

  • 首先,Siri学会以Notification CenterSpotlight搜索中弹出的建议的形式预测用户可能想要做的事情。
  • 其次,您的用户可以将这些活动转变为基于语音的快捷方式。

对于最后一点配置,添加用户在为此活动创建快捷方式时应考虑的建议短语:

activity.suggestedInvocationPhrase = "Time to write!"

所选择的短语应该是简短易记的。 它也应该不包括Hey, Siri这个短语,因为用户可能已经用这种方式触发了Siri的界面。

最后,将attributes对象分配给activity对象:

activity.contentAttributeSet = attributes

既然您可以从Article中获取用户活动对象,那么就可以使用它们了。


Using the Activity Object

打开ArticleFeedViewController.swift并找到newArticleWasTapped()

在注释下方添加以下行:

//1
let activity = Article.newArticleShortcut(thumbnail: UIImage(named: "notePad"))
vc.userActivity = activity

//2
activity.becomeCurrent()
  • 1) 首先,创建一个activity对象。 然后,将它附加到屏幕上的视图控制器。
  • 2) 接下来,调用becomeCurrent()来正式成为“当前”活动。 这是向系统注册活动的方法。

恭喜,您现在已成功将此活动移交给Siri。

建立并运行。 然后,转到新文章页面并返回主屏幕几次。

您不会在应用程序中看到任何有趣的内容,但每次执行该操作时,您都会向系统移交活动。

要验证,请在主屏幕上下拉以进行搜索。 然后,键入“write”,您应该会看到Write a new article操作。


Continuing a User Activity

在搜索中点击“Write a new article”结果。 您将被带到应用程序的主屏幕。

您的功能可能会暴露给系统,但是当系统告诉用户想要使用该功能时,您的应用程序没有做任何事情。

要对此请求作出反应,请打开AppDelegate.swift,并在该类的底部添加以下方法定义:

func application(
  _ application: UIApplication,
  continue userActivity: NSUserActivity,
  restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
  return true
}

在方法内部和return语句之前,创建New Article视图控制器并将其推送到导航堆栈:

let vc = NewArticleViewController()
nav?.pushViewController(vc, animated: false)

构建并再次运行。 当您搜索此功能并点按它时,您的应用会直接转到New Article屏幕。


Developer Settings for Working With Siri

到目前为止你所做的一切都是从Spotlight访问你的功能。 这不是什么新鲜事,即使Siri没有参与,它也会起作用,因为您的活动有资格进行搜索。

要证明Siri可以开始建议此操作,您需要转到Settings应用并启用一些选项。

打开Settings并找到Developer选项 滚动到底部,您将看到名为SHORTCUTS TESTING的部分。

启用“Display Recent Shortcuts”选项意味着最近移交的快捷方式将显示在Spotlight搜索中,而不是Siri的当前预测中。

同样,Display Donations on Lock Screen始终会将您最近的移交内容显示为锁定屏幕上的通知。

启用这两个选项,这样您就可以随时查看应用最近移交的快捷方式。

现在你已经知道如何看看Siri的建议是什么样的,现在是时候将这些活动变成全面的快捷方式了!


Turning User Activities Into Shortcuts

当用户想要将其中一个活动转换为快捷方式时,他们可以通过Settings应用进行此操作。 作为开发人员,您无需做任何其他事情。

测试一下:在您的设备上,打开Settings > Siri & Search

第一部分显示了手机上不同应用提交给系统的快捷方式列表。 您将在此列表中看到“Write a new article”快捷方式;如果不这样做,请点按More Shortcuts以查看更多内容。

要为此操作添加快捷方式,请点按该操作,您将进入快捷方式创建屏幕。

在这里,您可以看到之前添加的建议调用短语。

点按底部的红色圆圈。 当提示时,请告诉Siri“Time to write”。 在Siri确定您所说的内容后,点按Done以完成您的快捷方式。

现在,您的快捷方式与您创建的任何其他快捷方式一起列出。


Adding Shortcuts To Siri From Your App

这一切都很顺利,但您是否希望用户在Settings应用中捣乱为您的应用添加快捷方式? 不! 一点也不。

幸运的是,您可以通过您的应用提示您的用户直接执行此操作!

打开NewArticleViewController.swift,你会看到addNewArticleShortcutWasTapped()的空定义。

这是在点击蓝色“Add Shortcut to Siri”按钮时调用的方法。

IntentsUI框架提供了一个特殊的视图控制器,您可以使用快捷方式进行初始化。 然后,您可以显示此视图控制器,以显示您在Settings应用中看到的相同UI。

添加以下两行以初始化快捷方式:

let newArticleActivity = Article
  .newArticleShortcut(thumbnail: UIImage(named: "notePad.jpg"))
let shortcut = INShortcut(userActivity: newArticleActivity)

接下来,创建视图控制器,设置委托并显示视图:

let vc = INUIAddVoiceShortcutViewController(shortcut: shortcut)
vc.delegate = self

present(vc, animated: true, completion: nil)

此时,Xcode报出此类不适合作为该视图控制器的代理。 你需要解决这个问题。

在文件底部添加以下扩展名:

extension NewArticleViewController: INUIAddVoiceShortcutViewControllerDelegate {
}

然后,通过添加用户成功创建快捷方式的方法来符合INUIAddVoiceShortcutViewControllerDelegate协议:

func addVoiceShortcutViewController(
  _ controller: INUIAddVoiceShortcutViewController,
  didFinishWith voiceShortcut: INVoiceShortcut?,
  error: Error?
) {
}

此外,添加用户点击Cancel按钮时的方法:

func addVoiceShortcutViewControllerDidCancel(
  _ controller: INUIAddVoiceShortcutViewController) {
}

接下来,在调用这些方法时,您需要关闭Siri视图控制器。

将以下行添加到两个方法:

dismiss(animated: true, completion: nil)

构建并运行以试用它! 转到New Article view,然后点击Add Shortcut to Siri

你会看到一个视图控制器看起来很像你在Settings应用程序中设置快捷方式时看到的视图。 有了这个,您的用户将没有理由不利用您的应用程序的全部潜力!

后记

本篇主要介绍了构建Siri Shortcuts简单示例,感兴趣的给个赞或者关注~~~