版本记录
版本号 | 时间 |
---|---|
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 Center
和Spotlight
搜索中弹出的建议的形式预测用户可能想要做的事情。 - 其次,您的用户可以将这些活动转变为基于语音的快捷方式。
对于最后一点配置,添加用户在为此活动创建快捷方式时应考虑的建议短语:
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简单示例,感兴趣的给个赞或者关注~~~