美文网首页ios进阶酷
SiriKit框架详细解析(七) —— 构建Siri Short

SiriKit框架详细解析(七) —— 构建Siri Short

作者: 刀客传奇 | 来源:发表于2018-12-06 08:59 被阅读276次

    版本记录

    版本号 时间
    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简单示例,感兴趣的给个赞或者关注~~~

    相关文章

      网友评论

        本文标题:SiriKit框架详细解析(七) —— 构建Siri Short

        本文链接:https://www.haomeiwen.com/subject/hqqwcqtx.html