Ionic 3 iOS应用点击PayPal按钮崩溃问题求助
解决方案:Ionic 3 + Cordova iOS PayPal按钮崩溃问题
从你提供的崩溃日志来看,核心错误是:
2018-05-21 13:04:32.971875+0530 thegrand[665:8924] -[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000000000c5
这个问题的本质是iOS平台的强类型校验不兼容:Objective-C对类型要求严格,你的代码把一个数字类型(NSCFNumber)当成字符串调用了length方法;而Android平台的Java对类型兼容度更高,所以没有触发崩溃。结合你使用的PayPal插件场景,大概率是支付请求参数的类型传递有误,下面是具体解决步骤:
1. 检查PayPal请求参数的类型
重点核对以下关键参数,确保它们是字符串类型而非数字:
- 支付金额:比如不要直接传
9.99,要传"9.99" - 订单ID/交易ID:确保是字符串格式,不要传入纯数字ID
- PayPal客户端ID:确认配置的是字符串,没有误写成数字类型
示例代码修正:
// 错误写法:金额是数字类型 const paymentDetails = { amount: 9.99, currency: "USD", description: "Test Payment" }; // 正确写法:金额转为字符串 const paymentDetails = { amount: "9.99", currency: "USD", description: "Test Payment" };
2. 升级/适配PayPal Cordova插件版本
你的Cordova版本是4.5.3,可能当前使用的PayPal插件版本和该Cordova版本存在兼容性问题。建议重新安装适配Ionic 3的稳定版本:
# 先卸载旧插件 ionic cordova plugin rm cordova-plugin-paypal # 安装兼容版本(比如2.1.0,可根据实际情况调整) ionic cordova plugin add cordova-plugin-paypal@2.1.0
3. 验证iOS项目的PayPal配置
- 确认iOS项目中配置的PayPal沙箱客户端ID是正确的字符串,没有额外的空格或格式错误
- 检查
config.xml中的PayPal相关配置,确保所有参数都是字符串格式
4. 调试参数传递过程
在调用PayPal支付的代码前,添加类型校验日志,确认每个参数的类型:
console.log("Payment amount type:", typeof paymentDetails.amount); console.log("Payment amount value:", paymentDetails.amount);
如果输出显示number类型,就需要转为字符串后再传递给插件。
临时修复(若插件存在原生层问题)
如果是插件内部的类型转换bug,可以临时修改iOS原生代码:找到触发length调用的位置,添加类型判断,将NSNumber转为NSString,比如:
// 假设原代码是 NSString *someString = someValue; // 修改为 NSString *someString; if ([someValue isKindOfClass:[NSNumber class]]) { someString = [someValue stringValue]; } else { someString = (NSString *)someValue; }
不过优先推荐升级插件版本,避免手动修改原生代码带来的维护问题。
内容的提问来源于stack exchange,提问作者Krishanu Mukherjee
相关产品推荐
相关产品推荐

