我正在尝试将Siri Shortcuts集成到我的应用程序中。我尝试的概念是通过秘密PIN确认获取我的卡的奖励点数。请查看下面我所做的内容。
- 在能力中启用了Siri并添加了Siri Intent定义文件。
添加了一个名为say Rewards的新自定义意图。
定义了标题、副标题和参数(accType、pin),并启用了确认。 PIN将单独发送给用户。
- 然后定义了意图响应,其中包括参数'rewardPoints' 和响应消息的定义。
- 添加了Siri意图扩展。
- 在项目和intent extension中的info.plist文件中添加了自定义意图。
- 验证并添加了新的处理程序来处理自定义意图,并定义了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码,也无法获取账户的精确奖励积分。
以下是我的问题:
- 我们可以在代码中编程方式添加意图到Siri中,而不是从快捷方式应用程序或设置中添加吗?这样用户安装应用程序后就可以直接使用功能。
- 一旦使用快捷方式应用程序添加了意图,我尝试询问Siri奖励积分,它立即请求我定义的应用程序快捷方式。一旦我们回答“是”来响应请求,我需要被要求输入PIN码。但Siri会回复某些与我的应用程序相关的问题。为了询问下一个参数值,该怎么办。
- 在处理程序文件中,我为每个参数添加了resolve方法。我觉得,resolve方法没有被调用来验证值。我们需要处理什么才能使解决方法起作用?
- 如何使用resolve/handle/confirm方法中的断点调试处理程序实现。
提前感谢您的帮助。
应用程序名称
说”“ - Sultan Ali