ios – Siri融合付款问​​题

在我的申请中,我只支持欧元和美元的货币.所以当用户尝试用Siri向GBP发送付款,例如,我请他选择欧元和美元.

之后在屏幕上我看到:

> 100 $
> 100欧元

如果我在intent.currencyAmount!.currencyCode中选择100 $,我总是有GBP(但是用户选择了美元).这很奇怪

这是我的代码

func resolveCurrencyAmount(forSendPayment intent: INSendPaymentIntent,with completion: @escaping (INCurrencyAmountResolutionResult) -> Void) {
        if let currencyAmount = intent.currencyAmount { // need to check if we have proper value
            if let amount = currencyAmount.amount {

                if amount.doubleValue == 0 { // wrong amount
                    completion(INCurrencyAmountResolutionResult.unsupported())
                    return
                }

                if let currencyCode = currencyAmount.currencyCode {
                    if let _ = EnumCurrency(rawValue: currencyCode) { // we found currency code that we kNow
                        completion(INCurrencyAmountResolutionResult.success(with: INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)),currencyCode: currencyCode)))
                        return
                    }
                }


                // if we are here so we don't have proper currency,try to offer user to choose the same amount but with all possible currencies
                let disambiguationArray: [INCurrencyAmount] = EnumCurrency.allValues.map({ (currency) -> INCurrencyAmount in
                    return INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)),currencyCode: currency.rawValue)
                })
                completion(INCurrencyAmountResolutionResult.disambiguation(with: disambiguationArray))
            }
        }
        else { // we don't have value
            completion(INCurrencyAmountResolutionResult.needsValue())
        }
    }

enum EnumCurrency : String {
    case EUR = "EUR"
    case USD = "USD"

    static let allValues = [EUR,USD]
}

更新:如何复制(根据大卫问题):

1)创建一个新的意图实现

2)在plist文件中只留下一种类型的意图:http://take.ms/pt16N

3)您的IntentHandler类(将由xCode创建)必须确认为INSendPaymentIntentHandling协议

4)在IntentHandler类中添加

func resolveCurrencyAmount(forSendPayment intent: INSendPaymentIntent,with completion: @escaping (INCurrencyAmountResolutionResult) -> Void) {
            if let currencyAmount = intent.currencyAmount { // need to check if we have proper value
                if let amount = currencyAmount.amount {

                    if amount.doubleValue == 0 { // wrong amount


                 completion(INCurrencyAmountResolutionResult.unsupported())
                    return
                }

                if let currencyCode = currencyAmount.currencyCode {
                    if let _ = EnumCurrency(rawValue: currencyCode) { // we found currency code that we kNow
                        completion(INCurrencyAmountResolutionResult.success(with: INCurrencyAmount(amount: NSDecimalNumber(value: abs(amount.doubleValue)),USD]
}

// MARK: - Confirm

    func confirm(sendPayment intent: INSendPaymentIntent,completion: @escaping (INSendPaymentIntentResponse) -> Void) {
// success
        completion(INSendPaymentIntentResponse(code: INSendPaymentIntentResponseCode.success,userActivity: nil))

}

// MARK: - Handle

    func handle(sendPayment intent: INSendPaymentIntent,completion: @escaping (INSendPaymentIntentResponse) -> Void) {

// just for test
completion(INSendPaymentIntentResponse(code: .failureRequiringAppLaunch,userActivity: userActivity))
}

5)您可以与Siri一起推出:您将看到,如果您选择中国货币或任何其他不正规货币,然后我的代码使您可以选择欧元和美元之间,但之后在RESOLVE功能(当siri想要解决货币更多的时间)你会得到中国货币(所以你不需要添加任何代码的按钮像大卫问,因为所有的按钮接口将由Siri提供)

解决方法

我创建了这个问题:
Siri and wrong currency

所有您需要做的是确认用户选择的货币.
您的确认方法错误地执行,您应该使用以下方式确认货币:

let response = INSendPaymentIntentResponse(code: .ready,userActivity: nil)
response.paymentRecord = INPaymentRecord(
    payee: intent.payee,payer: nil,currencyAmount: intent.currencyAmount,paymentMethod: nil,note: nil,status: .pending,feeAmount: nil)
completion(response)

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...