我正在尝试将 Siri 快捷方式集成到我的应用程序中。我正在尝试的概念是通过密码确认获得我的卡的奖励积分。请在下面找到我为此所做的工作。
- 在功能中启用 Siri 并添加 Siri Intent 定义文件。
添加了名为 say Rewards 的新自定义意图。
定义标题。启用确认的字幕和参数(accType,pin)。 Pin 将单独发送给用户。
- 然后使用参数“rewardPoints”定义意图响应并定义响应消息。
- 添加了 Siri 意图扩展。
- 向项目和意图扩展中的 info.plist 文件添加了自定义意图。
- 为自定义意图验证并添加了新的处理程序,并定义了解析、处理和确认方法,如下所示。现在,我将随机返回 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)
}
}
- 修改了 IntentHandler 以返回奖励意图的奖励处理程序
//
// IntentHandler.swift
// SiriIntentExt
//
import Intents
class IntentHandler: INExtension {
override func handler(for intent: INIntent) -> Any {
if intent is RewardsIntent {
return RewardsIntentHandler()
}
return self
}
}
- 如下所示捐赠了 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 没有请求密码,也无法获得该帐户的确切奖励积分。
有以下问题。
- 我们能否以编程方式将意图添加到 Siri,而不是从快捷方式应用程序或设置中添加。这样用户就可以在安装应用程序后直接使用该功能。
- 使用快捷方式应用程序添加意图后,我正在尝试向 Siri 询问奖励积分。它立即请求定义我的应用程序快捷方式。一旦我们对请求说"is",我就需要被要求提供密码。但是 Siri 回复说我的应用程序有问题。要求下一个参数值要做什么。
- 在处理程序文件中,我为每个参数添加了解析方法。我觉得,没有调用 resolve 方法来验证值。我们是否需要处理任何事情才能使解析方法起作用?
- 如何使用 resolve/handle/confirm 方法中的断点来调试处理程序实现。
提前致谢。
最佳答案
找到我对以上问题的分析。
- 我们能否以编程方式将意图添加到 Siri,而不是从快捷方式应用程序或设置中添加。这样用户就可以在安装应用程序后直接使用该功能。
默认情况下,会为特定领域(例如消息、支付、照片、锻炼等)提供意图。无需通过快捷方式为这些特定领域显式添加意图。除了这些域之外,如果我们要创建自定义意图,我们还需要使用快捷方式/设置应用程序捐赠和添加意图到 Siri。
- 使用快捷方式应用程序添加意图后,我正在尝试向 Siri 询问奖励积分。它立即请求定义我的应用程序快捷方式。一旦我们对请求说"is",我就需要被要求提供密码。但是 Siri 回复说我的应用程序有问题。要求下一个参数值要做什么。
从 iOS13 开始,Apple 为自定义 Intent 添加了 Siri 参数和 Siri 建议以请求缺少的参数。直到 iOS12,我们没有自定义意图的参数选项。
- 在处理程序文件中,我为每个参数添加了解析方法。我觉得,没有调用 resolve 方法来验证值。我们是否需要处理任何事情才能使解析方法起作用?
在 iOS12 中,我们无法为自定义 Intent 中的参数添加 resolve 方法。仅针对问题 1 中提到的 Intents 扩展中提供的特定域处理的 Resolve 方法。从 iOS13 开始,我们可以根据参数为自定义 Intent 提供 resolve 方法。
- 如何使用 resolve/handle/confirm 方法中的断点来调试处理程序实现。
我们可以添加断点和调试意图处理程序方法。
谢谢。
关于ios - Siri 与自定义意图的集成面临问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513364/