Siri 快捷方式——如何实现它们?

已发表: 2020-01-16

Siri 快捷方式是去年 WWDC 上提出的一项新功能,它提供了在后台执行应用程序某些功能的能力。 我们不必打开应用程序就可以在应用程序中使用这些功能,我们可以简单地对 Siri 说,例如“汉堡时间”,系统就会知道该快捷方式分配给哪个应用程序并为我们订购汉堡。

什么是 Siri 快捷方式?

  • 从锁定屏幕或搜索区域完成任务的便捷方式。
  • 还可以将快捷方式添加到 Siri,以便在 iOS、HomePod 和 watchOS 上使用语音短语运行。
  • 开发人员将快捷方式挂钩添加到他们的应用程序中,使 Siri 能够连接到这些快捷方式。
  • 使用您行为的机器学习模型来分析您执行的常见功能并自动建议快捷方式。
  • iOS 12+

在本文中,我们将重点介绍下单快捷方式的实现,这是 Siri Shortcuts 最流行的应用程序之一。 我们将创建一个简单的应用程序,让您可以订购汉堡

我们如何创建 Siri 快捷方式?

创建 Siri 快捷方式的过程
  1. 一开始,我们必须考虑用户真正想要在我们的应用程序中简化的功能。 这应该是用户经常执行的功能,并且需要用户进入应用程序并在其中传递很长的路径。 快捷方式将能够缩短此路径以执行功能。
  2. 在下一步中,您需要捐赠一个快捷方式。 这是什么意思? 我们必须将有关我们已下订单的信息传递给系统,例如一个带有培根的汉堡。 我们将此信息提供给系统,然后 Siri 可以在特定时间建议我们进行此特定订单。
  3. 最后要做的是处理这个快捷方式,当用户告诉 Siri 之前定义的命令时,例如“汉堡时间”,或者当用户在锁定屏幕上按下 Siri 建议的快捷方式时,就会发生这种情况。

好吧,也许我们会写一些代码? 作为开发人员,我们有哪些可能性?

NSUserActivity & Intents - Siri 快捷方式示例

NSUserActivity - 我们将创建一个快捷方式,让我们启动屏幕以进行新订单

  1. 将密钥添加到 Info.plist
 <key>NSUserActivityTypes</key>
<数组>
	<string>com.miquido.SiriShotcutDemo.make-order</string>
</array>

2.用户进屏时捐赠快捷方式

 让 orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order")
orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order")
orderActivity.isEligibleForSearch = true
orderActivity.isEligibleForPrediction = true
orderActivity.title = "下订单"
orderActivity.suggestedInvocationPhrase = "汉堡时间"

让属性 = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
attributes.contentDescription = "美味的汉堡!"
attributes.thumbnailData = UIImage(named: "logo")?.pngData()
orderActivity.contentAttributeSet = 属性
用户活动 = 订单活动

3. 在AppDelegate中,您必须实现continueUserActivity委托,在获得此特定类型后,将重定向到给定屏幕

 func应用程序(_应用程序:UIApplication,
                 继续用户活动:NSUserActivity,
                 restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    如果 userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" {
        // 处理订单屏幕上打开的应用程序
        返回真
    } 
    返回假
} 
实施 Siri 快捷方式来点汉堡的过程

意图——我们将实现一个快捷方式来下订单

实施前的专业提示:
当用户系统地做某事时,意图就会出现。 但是,当您想测试此功能以便始终从 Siri 获得建议时,您必须在设置 -> 开发人员中启用两个选项——“显示最近的快捷方式”和“在锁定屏幕上显示捐款”。

选项:在锁定屏幕上显示最近的快捷方式和显示捐赠
  1. 创建意图定义文件。 最好的方法是将它添加到我项目中的单独框架中,它将位于OrderKit中。
SiriKit 意图定义文件图标

2. 选择一个类别,在本例中为“订单”。 在这个文件中,我们必须选择我们将传递给系统的参数并创建这些参数的组合。

自定义 Intent、参数和快捷方式类型
订单定义 – 创建自定义意图
订单定义 - 定义响应
订单定义 - 定义响应

3. 创建一个带有意图扩展的新目标,创建时选择“包含 UI 扩展”。

意图扩展图标
文件 -> 新建 -> 目标... -> 意图扩展
这是Order.intentdefinition的 Target Membership 的样子

4. 在MainInterface.storyboard文件中为意图创建一个 UI。

为意图创建 UI
为我们的 Intent 创建 UI

5. 在IntentViewController中配置readysuccess状态。

 func configureView(for 参数: Set<INParameter>,
                       交互:INInteraction,
                       交互行为:INUI交互行为,
                       上下文:INUIHostedViewContext,
                       完成:@escaping (Bool, Set<INParameter>, CGSize) -> Void) {
        
    守卫让意图=交互。意图为? 订单意向其他 {
        完成(假,设置(),.零)
        返回
    }
    如果interaction.intentHandlingStatus == .ready {
        设置(含:意图)
        waitTime.isHidden = true
        完成(真,参数,desiredSize)
    } 否则,如果interaction.intentHandlingStatus == .success,
        让 response = interaction.intentResponse 作为? 订单意向响应 {
        设置(含:意图)
        waitTime.isHidden = false
        如果让 waitTimeText = response.waitTime {
            waitTime.text = "订单将在 \(waitTimeText) 分钟内准备好"
        }
        EverythingIsOkLabel.text = "点击显示订单"
        完成(真,参数,desiredSize)
    }

    完成(假,参数,.zero)
}

私人功能设置(意图:OrderIntent){
    burgerNameLabel.text = intent.burgerName
    如果让数量 = intent.quantity?.stringValue {
        quantityLabel.text = "\(数量) 个。"
    }
    如果让添加 = intent.additions {
        addedsLabel.text = 添加.元素.toString
    }
}

6.创建好UI后,我们就可以去捐赠我们的意向了。 在这种情况下,最好在下单时注明捐赠意向。 我们向系统提供我们之前在文件Order.intentdefinition中定义的所有信息,即汉堡名称、数量和添加物,以及在我们想在下订单时立即将此快捷方式添加到 Siri 的情况下显示的建议短语.

 private func donateInteraction(for order: Order) {
    让交互= INInteraction(意图:order.intent,响应:无)
    
    互动.捐赠{(错误)在
        如果错误!= nil {
            // 处理错误
        } 别的 {
            print("捐赠互动成功")
        }
    }
} 
 公共扩展订单{
    
    变种意图:OrderIntent {
        让 orderIntent = OrderIntent()
        orderIntent.burgerName = 名称
        如果让intValue = Int(数量){
            orderIntent.quantity = NSNumber(值:intValue)
        }
        orderIntent.suggestedInvocationPhrase = "汉堡时间"
        
        orderIntent.additions = addeds.map { option -> INObject in
            返回INObject(标识符:option.rawValue,
                            显示:option.rawValue)
        }
        退货订单意向
    }
    
}

7. 现在我们可以处理当用户收到快捷方式的建议并单击它以及用户通过 Siri 调用快捷方式时会发生什么情况。

 公共类 OrderIntentHandler: NSObject, OrderIntentHandling {
    
    公共函数确认(意图:OrderIntent,
                        完成:@escaping (OrderIntentResponse) -> Void) {
        完成(OrderIntentResponse(代码:OrderIntentResponseCode.ready,userActivity:nil))
    }
    
    公共函数句柄(意图:OrderIntent, 
                       完成:@escaping (OrderIntentResponse) -> Void) {
        守卫让 burgerName = intent.burgerName else {
            完成(OrderIntentResponse(代码:.failure,userActivity:nil))
            返回
        }
        
        Defaults.save(订单:订单(来自:意图))
        完成(OrderIntentResponse.success(burgerName:burgerName,waitTime:“5”))
    }
    
} 
Siri 快捷方式演示

就是这样,一切正常

你可以在这里查看我的 GitHub 上的整个项目

资料来源:

  • https://developer.apple.com/videos/play/wwdc2018/211/
  • https://developer.apple.com/videos/play/wwdc2018/214/
  • https://developer.apple.com/documentation/sirikit/donating_shortcuts
  • https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
  • https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12