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
相关产品推荐
相关产品推荐

