NativeScript实现Apple Pay时payment变量为空问题求助
解决NativeScript中Apple Pay授权时payment变量为空的问题
我来帮你排查这个困扰你的问题——不管是沙箱测试还是TestFlight环境下,paymentAuthorizationViewControllerDidAuthorizePaymentHandler里的payment变量都为空,结合你的代码来看,主要有几个关键问题需要调整:
1. Delegate方法签名不匹配(核心问题)
Apple的PKPaymentAuthorizationViewControllerDelegate协议里,授权完成的正确方法签名是:
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus status))completion;
你代码里用的paymentAuthorizationViewControllerDidAuthorizePaymentHandler并不是系统能识别的方法名,NativeScript对Objective-C方法的绑定要求严格匹配命名规则(去掉冒号,将每个分段的首字母大写),所以系统根本不会触发这个回调,自然payment参数为空。
修正方法:把方法名改成正确的paymentAuthorizationViewControllerDidAuthorizePaymentCompletion,确保参数数量和类型完全对应:
PKPaymentAuthorizationViewControllerDelegateIml.prototype.paymentAuthorizationViewControllerDidAuthorizePaymentCompletion = function(controller, payment, completion){ console.log('authorization', payment.token?.paymentData) // 用可选链避免空值报错 completion(PKPaymentAuthorizationStatus.Success) }
2. Delegate对象被垃圾回收
你创建的listener是局部变量,NativeScript的垃圾回收机制可能会在回调触发前就回收这个对象,导致Delegate失效,无法传递payment参数。
修正方法:把listener保存到组件的实例属性中,避免被GC回收:
methods:{ applePay(){ // ... 其他配置代码 ... // 保存listener到实例属性 this.applePayListener = PKPaymentAuthorizationViewControllerDelegateIml.new(); let applePayController = new PKPaymentAuthorizationViewController(paymentRequest); applePayController.delegate = this.applePayListener; // ... 后续present代码 ... } }
3. 额外的配置检查
除了代码问题,还要确保这些配置项正确:
- 确认
ApplePaySwagMerchantID和你在Apple开发者后台创建的Merchant ID完全一致,并且已经关联到你的App ID,开启了Apple Pay服务。 - 沙箱测试时,必须使用Apple官方提供的沙箱测试账号和对应的沙箱测试信用卡,不能用真实账号。
- TestFlight环境下,要确保Merchant ID已经配置了生产环境的Apple Pay证书,并且你的真实信用卡支持Apple Pay(部分地区或卡种可能有限制)。
按照以上步骤调整后,应该就能正常获取到payment参数了。
内容的提问来源于stack exchange,提问作者Almaz Ilyasov
相关产品推荐
相关产品推荐

