ios - Siri 与自定义意图的集成面临问题

标签 ios swift siri sirikit sirishortcuts

我正在尝试将 Siri 快捷方式集成到我的应用程序中。我正在尝试的概念是通过密码确认获得我的卡的奖励积分。请在下面找到我为此所做的工作。

  1. 在功能中启用 Siri 并添加 Siri Intent 定义文件。
  2. 添加了名为 say Rewards 的新自定义意图。

  3. 定义标题。启用确认的字幕和参数(accType,pin)。 Pin 将单独发送给用户。

enter image description here

  1. 然后使用参数“rewardPoints”定义意图响应并定义响应消息。

enter image description here

  1. 添加了 Siri 意图扩展。
  2. 向项目和意图扩展中的 info.plist 文件添加了自定义意图。

enter image description here

enter image description here

  1. 为自定义意图验证并添加了新的处理程序,并定义了解析、处理和确认方法,如下所示。现在,我将随机返回 no 以获得奖励积分。
//
//  RewardsIntentHandler.swift
//  SiriIntentExt
//

import UIKit
import Intents

class RewardsIntentHandler: NSObject, RewardsIntentHandling {

    func resolveAccType(for intent:RewardsIntent, with completion: @escaping ([INStringResolutionResult]) -> Void) {
        guard let accType = intent.accType else {
            completion([INStringResolutionResult.needsValue()])
            return
        }

        completion([INStringResolutionResult.success(with: accType)])
    }

    func resolvePin(for intent:RewardsIntent, with completion: @escaping ([INIntegerResolutionResult]) -> Void) {

        guard let verifyPin = intent.pin else {
            completion([INIntegerResolutionResult.needsValue()])
            return
        }

        completion([INIntegerResolutionResult.confirmationRequired(with: verifyPin as? Int)])
    }

    func confirm(intent: RewardsIntent, completion: @escaping (RewardsIntentResponse) -> Void) {
        completion(RewardsIntentResponse.init(code: RewardsIntentResponseCode.ready, userActivity: nil))
    }

    func handle(intent: RewardsIntent, completion: @escaping (RewardsIntentResponse) -> Void) {

        guard intent.accType != nil else {
            completion(RewardsIntentResponse.init(code: RewardsIntentResponseCode.continueInApp, userActivity: nil))
            return
        }

        guard intent.pin != nil else {
            completion(RewardsIntentResponse.init(code: RewardsIntentResponseCode.continueInApp, userActivity: nil))
            return
        }

        let response = RewardsIntentResponse.success(rewardPoints: NSNumber(value: 3453))
        completion(response)
    }
}
  1. 修改了 IntentHandler 以返回奖励意图的奖励处理程序
//
//  IntentHandler.swift
//  SiriIntentExt
//

import Intents

class IntentHandler: INExtension {

    override func handler(for intent: INIntent) -> Any {

        if intent is RewardsIntent {
            return RewardsIntentHandler()
        }

        return self
    }

}
  1. 如下所示捐赠了 View 加载的意图。
//
//  ViewController.swift
//  Shortcuts
//

import UIKit
import Intents

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        siriAuthorisarion()
        donateRewardIntent()
    }

    func siriAuthorisarion()  {

        INPreferences.requestSiriAuthorization { (status) in
            print("Siri Authorization Status - ", status)
        }
    }

    func donateRewardIntent() {

        let rewardsIntent = RewardsIntent()
        rewardsIntent.suggestedInvocationPhrase = "Reward Points"
        rewardsIntent.accType = "test account"

        let interaction = INInteraction(intent: rewardsIntent, response: nil)

        interaction.donate { error in
            if let error = error {
                print("Donating intent failed with error \(error)")
            }

            DispatchQueue.main.async {
                let alert = UIAlertController.init(title: ((error != nil) ? "Error" : "Success"), message: ((error != nil) ? "Oops!!! Error occured on donating intent." : "Intent donated succussfully!!!"), preferredStyle: .alert)
                alert.addAction(UIAlertAction.init(title: "OK", style: .default, handler: nil))
                self.present(alert, animated: true, completion: nil)
            }
        }
    }
}

我正面临来自上述代码库的问题。 Siri 没有请求密码,也无法获得该帐户的确切奖励积分。

有以下问题。

  1. 我们能否以编程方式将意图添加到 Siri,而不是从快捷方式应用程序或设置中添加。这样用户就可以在安装应用程序后直接使用该功能。
  2. 使用快捷方式应用程序添加意图后,我正在尝试向 Siri 询问奖励积分。它立即请求定义我的应用程序快捷方式。一旦我们对请求说"is",我就需要被要求提供密码。但是 Siri 回复说我的应用程序有问题。要求下一个参数值要做什么。
  3. 在处理程序文件中,我为每个参数添加了解析方法。我觉得,没有调用 resolve 方法来验证值。我们是否需要处理任何事情才能使解析方法起作用?
  4. 如何使用 resolve/handle/confirm 方法中的断点来调试处理程序实现。

提前致谢。

最佳答案

找到我对以上问题的分析。

  1. 我们能否以编程方式将意图添加到 Siri,而不是从快捷方式应用程序或设置中添加。这样用户就可以在安装应用程序后直接使用该功能。

默认情况下,会为特定领域(例如消息、支付、照片、锻炼等)提供意图。无需通过快捷方式为这些特定领域显式添加意图。除了这些域之外,如果我们要创建自定义意图,我们还需要使用快捷方式/设置应用程序捐赠和添加意图到 Siri。

  1. 使用快捷方式应用程序添加意图后,我正在尝试向 Siri 询问奖励积分。它立即请求定义我的应用程序快捷方式。一旦我们对请求说"is",我就需要被要求提供密码。但是 Siri 回复说我的应用程序有问题。要求下一个参数值要做什么。

从 iOS13 开始,Apple 为自定义 Intent 添加了 Siri 参数和 Siri 建议以请求缺少的参数。直到 iOS12,我们没有自定义意图的参数选项。

  1. 在处理程序文件中,我为每个参数添加了解析方法。我觉得,没有调用 resolve 方法来验证值。我们是否需要处理任何事情才能使解析方法起作用?

在 iOS12 中,我们无法为自定义 Intent 中的参数添加 resolve 方法。仅针对问题 1 中提到的 Intents 扩展中提供的特定域处理的 Resolve 方法。从 iOS13 开始,我们可以根据参数为自定义 Intent 提供 resolve 方法。

  1. 如何使用 resolve/handle/confirm 方法中的断点来调试处理程序实现。

我们可以添加断点和调试意图处理程序方法。

谢谢。

关于ios - Siri 与自定义意图的集成面临问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513364/

相关文章:

ios - 在 iOS swift 应用程序上更新用户 token

ios - 意外发现nil tableView.registerNib

swift - 带自定义对象的 PushRow 和 Eureka 表单

ios - 使用 Crashlytics Fabric 的崩溃报告在更新后不起作用

ios - 使用 UINavigationController 时 UIStackView 无法设置底部约束

c++ - 忽略 iOS 应用程序中的库以针对模拟器进行编译

ios - 如何在不调用 reloadData 的情况下删除 UITableView 中的行并更新 indexPaths?

ios - 我们可以从第三方应用程序在 siri 中设置事件吗?

ios - 可供 AVSpeechSynthesis 在 iOS 中使用的已安装语音的可用性

ios - UISearchBarDelegate 的 textDidChange 方法在语音转文本时有奇怪的行为