使用自定义意图集成Siri时遇到问题

5

我正在尝试将Siri Shortcuts集成到我的应用程序中。我尝试的概念是通过秘密PIN确认获取我的卡的奖励点数。请查看下面我所做的内容。

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

  3. 定义了标题、副标题和参数(accType、pin),并启用了确认。 PIN将单独发送给用户。

enter image description here

  1. 然后定义了意图响应,其中包括参数'rewardPoints' 和响应消息的定义。

enter image description here

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

enter image description here

enter image description here

  1. 验证并添加了新的处理程序来处理自定义意图,并定义了resolve、handle和confirm方法,如下所示。目前,我为奖励点数返回随机数字。
//
//  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)
    }
}

修改了IntentHandler以返回奖励意图的奖励处理程序。
//
//  IntentHandler.swift
//  SiriIntentExt
//

import Intents

class IntentHandler: INExtension {

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

        if intent is RewardsIntent {
            return RewardsIntentHandler()
        }

        return self
    }

}

在视图加载时将意图捐赠为下面的形式。
//
//  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没有请求PIN码,也无法获取账户的精确奖励积分。

以下是我的问题:

  1. 我们可以在代码中编程方式添加意图到Siri中,而不是从快捷方式应用程序或设置中添加吗?这样用户安装应用程序后就可以直接使用功能。
  2. 一旦使用快捷方式应用程序添加了意图,我尝试询问Siri奖励积分,它立即请求我定义的应用程序快捷方式。一旦我们回答“是”来响应请求,我需要被要求输入PIN码。但Siri会回复某些与我的应用程序相关的问题。为了询问下一个参数值,该怎么办。
  3. 在处理程序文件中,我为每个参数添加了resolve方法。我觉得,resolve方法没有被调用来验证值。我们需要处理什么才能使解决方法起作用?
  4. 如何使用resolve/handle/confirm方法中的断点调试处理程序实现。

提前感谢您的帮助。

1个回答

2
以下是上述问题的分析:
1. 我们是否可以以编程方式向Siri添加意图,而不是从快捷方式应用程序或设置中添加。这样,用户安装应用程序后就可以直接使用功能。
默认情况下,意图是针对特定领域提供的,例如消息、付款、照片、锻炼等。对于这些特定领域,无需通过快捷方式显式添加意图。除了这些领域之外,如果我们创建自定义意图,则需要使用快捷方式/设置应用程序将意图捐赠并添加到Siri中。
2. 一旦使用快捷方式应用程序添加了意图,我尝试要求Siri获取奖励积分。它立即请求我的应用程序快捷方式定义。一旦我们回答“是”,我需要被要求输入个人识别码。但是Siri回复说我的应用程序存在问题。如何请求下一个参数值?
从iOS13开始,苹果公司已经添加了Siri参数和Siri建议,用于请求缺少的自定义意图参数。在iOS12之前,我们没有自定义意图的参数选项。
3. 在处理程序文件中,我已为每个参数添加了解析方法。我感觉,解析方法没有被调用以验证值。我们需要处理什么才能使解析方法工作?
在iOS12中,我们不能为自定义意图的参数添加解析方法。解析方法仅处理Intents扩展中提供的特定领域,如问题1所述。从iOS13开始,我们可以根据参数为自定义意图添加解析方法。
4. 如何使用断点在解决/处理/确认方法中调试处理程序实现?
我们可以添加断点并调试意图处理程序方法。
谢谢。

我已经添加了快捷方式,但是它显示错误:“某些事情出错了应用程序名称说”“ - Sultan Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接