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

提交Apple Pay payload处理时触发EXC_BAD_ACCESS崩溃问题求助

崩溃触发原因
  • 核心崩溃点EXC_BAD_ACCESS的常见触发场景如下:
    1. paymentController属性使用了weak/unowned修饰,初始化完成后立即被ARC自动释放,导致野指针
    2. 在非主线程调用PassKit相关接口,苹果要求PKPaymentAuthorizationController相关操作必须在主线程执行
    3. paymentSummaryItems参数非法:数组为空、元素的amount属性不是NSDecimalNumber类型、数值为0或负数、汇总项类型不符合要求
    4. merchantIdentifier未在开发者后台配置Apple Pay权限,或参数值与后台配置不匹配
  • 调试时出现的cannot find type 'PassKit' in scope是LLDB调试器未导入PassKit框架导致的提示,不是运行时崩溃的根本原因
解决方案
  • 首先校验paymentController属性声明,确保使用强引用,正确声明示例:
var paymentController: PKPaymentAuthorizationController?

不要添加weak、unowned修饰符

  • 强制将Apple Pay初始化、展示逻辑放到主线程执行:
DispatchQueue.main.async {
    self.paymentController = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
    self.paymentController?.delegate = self
    self.paymentController?.present(completion: { presented in
        if presented {
            debugPrint("Presented payment controller")
        } else {
            debugPrint("Failed to present payment controller")
            self.output?.responseWith(nil)
        }
    })
}
  • 校验paymentSummaryItems合法性:
    • 保证数组不为空,至少包含1个汇总项
    • 所有amount属性使用NSDecimalNumber构造,不要直接传入Int/Double类型,数值必须大于0
    • 最后一个汇总项为总金额,类型设置为.final,示例:
    let totalItem = PKPaymentSummaryItem(label: "商户名称", amount: NSDecimalNumber(string: "99.9"), type: .final)
    
  • 校验商户ID配置:确认merchantIdentifier参数值和苹果开发者后台配置的商户ID完全一致,且对应ID已开通Apple Pay权限
  • 调试时查看PassKit相关变量前,在LLDB控制台输入e @import PassKit即可解决无法查看变量的提示问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:27:03