You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现PKAddPaymentPassViewControllerDelegate时Flutter Channel传Base64数据的疑问

问题与解答:Flutter与Swift间传递PKAddPaymentPass相关二进制数据

问题描述

我正在Swift中实现PKAddPaymentPassViewControllerDelegate,因为使用Flutter,需要传递若干Base64编码的Data(包含certificates数组、nonce及nonceSignature)。请问调用方法时,是否需要先解码再传给Flutter层,之后重新编码用于网络请求?还是标准Binary Messenger支持直接发送编码后的字符串?

以下是我目前编写的代码:

public func addPaymentPassViewController(
                                    _ controller: PKAddPaymentPassViewController,
                                    generateRequestWithCertificateChain certificates: [Data],
                                    nonce: Data,
                                    nonceSignature: Data,
                                    completionHandler handler: @escaping (PKAddPaymentPassRequest) -> Void) {

flutterChannel.invokeMethod("provisionRequest",
            arguments: [
               "certificates": certificates,
               "nonce": nonce,
               "nonceSignature": nonceSignature,
            ]) {
                responseData in
                let data = responseData as! [String: Any]
                let addPaymentPassRequest = PKAddPaymentPassRequest()
                addPaymentPassRequest.encryptedPassData = Data(base64Encoded: data["passData"], options: .ignoreUnknownCharacters)
                addPaymentPassRequest.activationData = Data(base64Encoded: data["activationData"], options: .ignoreUnknownCharacters)
                addPaymentPassRequest.ephemeralPublicKey = Data(base64Encoded: data["ephemeralKey"], options: .ignoreUnknownCharacters)
                handler(addPaymentPassRequest)
            }

解决方案

直接传递Data类型给Flutter是不可行的——Flutter的Method Channel默认不支持直接序列化二进制Data对象。你需要先将这些Data转换成Base64字符串再传递,到Flutter层后可以直接使用这个字符串做网络请求,不需要额外解码再编码。

修改后的Swift代码应该这样处理参数:

public func addPaymentPassViewController(
                                    _ controller: PKAddPaymentPassViewController,
                                    generateRequestWithCertificateChain certificates: [Data],
                                    nonce: Data,
                                    nonceSignature: Data,
                                    completionHandler handler: @escaping (PKAddPaymentPassRequest) -> Void) {

    // 将所有Data转换为Base64字符串
    let base64Certificates = certificates.map { $0.base64EncodedString() }
    let base64Nonce = nonce.base64EncodedString()
    let base64NonceSignature = nonceSignature.base64EncodedString()

    flutterChannel.invokeMethod("provisionRequest",
                arguments: [
                   "certificates": base64Certificates,
                   "nonce": base64Nonce,
                   "nonceSignature": base64NonceSignature,
                ]) {
                    responseData in
                    guard let data = responseData as? [String: String] else {
                        // 处理类型转换失败的情况,比如返回默认空请求或者报错
                        handler(PKAddPaymentPassRequest())
                        return
                    }
                    let addPaymentPassRequest = PKAddPaymentPassRequest()
                    addPaymentPassRequest.encryptedPassData = Data(base64Encoded: data["passData"] ?? "", options: .ignoreUnknownCharacters)
                    addPaymentPassRequest.activationData = Data(base64Encoded: data["activationData"] ?? "", options: .ignoreUnknownCharacters)
                    addPaymentPassRequest.ephemeralPublicKey = Data(base64Encoded: data["ephemeralKey"] ?? "", options: .ignoreUnknownCharacters)
                    handler(addPaymentPassRequest)
                }
}

关键说明:

  • Swift的Data无法直接通过Method Channel传递给Flutter,必须转成字符串类型(Base64是标准做法)
  • Flutter层拿到Base64字符串后,可直接作为请求参数发送给后端,无需解码成二进制再重新编码
  • 代码中增加了类型安全检查,避免强制解包导致的崩溃

内容的提问来源于stack exchange,提问作者gbaccetta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:06:28