React Native中PKAddPaymentPassViewController点击cancel无法dismiss问题
问题根因
点击cancel按钮无法关闭弹窗是以下两个常见原因导致:
- 你创建的
PKAddPaymentPassDelegate实例是局部变量,作用域结束后会被ARC自动回收,代理回调无法正常触发 - 未完整实现
PKAddPaymentPassViewControllerDelegate的必填方法,尤其是点击取消/完成后会触发的结束回调
解决方案
1. 全局持有代理实例
不要在弹出视图的逻辑中声明局部delegate变量,改为在你当前的原生模块类中添加属性持有,避免被提前释放:
// 原生模块类内部属性 private var paymentPassDelegate: PKAddPaymentPassDelegate?
2. 修改弹窗弹出逻辑
修改原有弹出代码,将代理实例赋值给全局属性持有,同时增加配置合法性判断:
self.paymentPassDelegate = PKAddPaymentPassDelegate() guard let config = pkAddPaymentPassRequestConfiguration, let pkAddPaymentPassViewController = PKAddPaymentPassViewController( requestConfiguration: config, delegate: self.paymentPassDelegate! ) else { // 配置无效的容错处理 return } DispatchQueue.main.async { RCTPresentedViewController()?.present( pkAddPaymentPassViewController, animated: true ) }
3. 完整实现代理方法
PKAddPaymentPassViewControllerDelegate有两个必填方法必须实现,其中addPaymentPassViewControllerDidFinish会在用户点击取消、添加成功、添加失败三种场景都触发,在该方法内手动执行dismiss即可:
extension PKAddPaymentPassDelegate: PKAddPaymentPassViewControllerDelegate { // 操作结束回调(含取消场景) func addPaymentPassViewController( _ controller: PKAddPaymentPassViewController, didFinishAdding pass: PKPaymentPass?, error: Error? ) { // 手动关闭弹窗 controller.dismiss(animated: true) // 这里可以补充添加结果的回调逻辑到RN层 } // 发卡请求生成回调,必须实现,否则会崩溃 func addPaymentPassViewController( _ controller: PKAddPaymentPassViewController, generateRequestWithCertificateChain certificates: [Data], nonce: Data, nonceSignature: Data, completionHandler: @escaping (PKAddPaymentPassRequest) -> Void ) { // 此处实现你自己的业务逻辑:把证书、nonce等参数传给后端,生成PKAddPaymentPassRequest后调用completionHandler } }
额外注意点
- 确认主线程没有被其他耗时任务阻塞,导致dismiss动画无法正常执行
- 检查
pkAddPaymentPassRequestConfiguration的配置是否合法,配置错误也可能导致视图生命周期异常
内容的提问来源于stack exchange,提问作者noctifer20
相关产品推荐
相关产品推荐

