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

PKAddPaymentPassViewController取消按钮无响应问题求助

PKAddPaymentPassViewController取消按钮无响应问题解决

当使用第三方工具生成PKAddPaymentPassViewController时,取消按钮无响应的核心原因是没有为控制器设置代理并实现对应的协议方法。PKAddPaymentPassViewController依赖PKAddPaymentPassViewControllerDelegate来处理取消、完成等用户操作回调。

解决步骤:

  1. 让你的ViewController遵循PKAddPaymentPassViewControllerDelegate协议
  2. 在获取到控制器实例后,手动设置其delegate属性为当前控制器
  3. 实现协议要求的两个代理方法,处理取消和添加完成逻辑

修改后的完整代码:

import UIKit
import PassKit

class ViewController: UIViewController, PKAddPaymentPassViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupApplePayButton()
    }

    private func setupApplePayButton() {
        let passKitButton = PKAddPassButton(addPassButtonStyle: .blackOutline)
        passKitButton.addTarget(self, action: #selector(onEnroll), for: .touchUpInside)
        view.addSubview(passKitButton)
        passKitButton.translatesAutoresizingMaskIntoConstraints = false
        passKitButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 32).isActive = true
        passKitButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32).isActive = true
        passKitButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32).isActive = true
    }

    @objc private func onEnroll(button: UIButton) {
        print("User wants to enroll")
        let checkDevice = PassKitCardDetector.checkSupportApplePay(cardSuffix: "9000")
        print(checkDevice)

        let requestGenerator = PassKitRequestGenerator(
            primaryAccountIdentifier: nil,
            primaryAccountSuffix: "9000",
            localizedDescription: "AAA",
            paymentNetwork: .visa,
            encryptionScheme: .ECC_V2
        ) { [weak self] passData, _ in
            // 处理卡片数据回调逻辑
        } completion: { _ in
            // 处理请求完成逻辑
        }
        
        guard let addPassVC = requestGenerator.inAppViewController() else {
            print("Failed to create PKAddPaymentPassViewController")
            return
        }
        // 设置代理,这是取消按钮能响应的关键
        addPassVC.delegate = self
        present(addPassVC, animated: true)
    }

    // MARK: - PKAddPaymentPassViewControllerDelegate
    // 用户点击取消或添加完成后触发,负责关闭控制器
    func addPaymentPassViewControllerDidFinish(_ controller: PKAddPaymentPassViewController) {
        controller.dismiss(animated: true)
        print("用户取消或完成卡片添加,控制器已关闭")
    }

    // 卡片添加完成后的结果回调(成功/失败)
    func addPaymentPassViewController(_ controller: PKAddPaymentPassViewController, didFinishAddingPass pass: PKPaymentPass?, error: Error?) {
        if let error = error {
            print("卡片添加失败:\(error.localizedDescription)")
        } else if let pass = pass {
            print("卡片添加成功:\(pass.primaryAccountSuffix ?? "")")
        }
    }
}

关键说明:

  • addPaymentPassViewControllerDidFinish(_:)是必须实现的方法,无论用户点击取消还是完成添加,系统都会调用这个方法,你需要在这里手动关闭控制器。
  • addPaymentPassViewController(_:didFinishAddingPass:error:)用于获取添加操作的具体结果(成功或失败),可以在这里做对应的业务逻辑处理。
  • 必须确保为PKAddPaymentPassViewController设置delegate,否则取消按钮的点击事件不会被捕获,也就无法触发任何回调。

内容的提问来源于stack exchange,提问作者Minh Tâm Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:17:41