提交Apple Pay payload处理时触发EXC_BAD_ACCESS崩溃问题求助
崩溃触发原因
- 核心崩溃点
EXC_BAD_ACCESS的常见触发场景如下:paymentController属性使用了weak/unowned修饰,初始化完成后立即被ARC自动释放,导致野指针- 在非主线程调用PassKit相关接口,苹果要求PKPaymentAuthorizationController相关操作必须在主线程执行
paymentSummaryItems参数非法:数组为空、元素的amount属性不是NSDecimalNumber类型、数值为0或负数、汇总项类型不符合要求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
相关产品推荐
相关产品推荐

