Flutter集成square_in_app_payments后上架Play Store完成卡片输入时崩溃
问题原因定位及修复方案
1. 最可能诱因:R8/ProGuard混淆规则缺失
因为只有Play Store渠道的Release包复现问题,Debug包正常,90%以上的概率是Release构建时的混淆操作误删除了Square支付SDK的相关类,导致调用SDK方法时触发类找不到异常直接闪退。
修复步骤:
- 打开项目下的
android/app/proguard-rules.pro文件,添加以下Square SDK专属混淆保留规则:
-keep class com.squareup.sdk.inapppayments.** { *; } -keep interface com.squareup.sdk.inapppayments.** { *; } -dontwarn com.squareup.sdk.inapppayments.** -keep class sqip.flutter.** { *; } -keep interface sqip.flutter.** { *; }
- 确认
android/app/build.gradle中Release构建配置开启了混淆规则加载:
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
重新构建Release包测试即可。
2. 次常见诱因:环境配置不匹配
- 检查上传Play Store的Release包使用的
squareApplicationId是否为Square后台申请的生产环境ID,不要混用测试环境ID,否则会触发SDK初始化异常。 - 确认
android/app/build.gradle中的minSdkVersion>= 21,Square In-App Payments SDK最低支持Android 5.0,低于该版本会触发兼容性闪退。
3. 代码逻辑潜在问题
你当前的_cardNonceRequestSuccess方法执行顺序存在风险:先调用InAppPayments.completeCardEntry关闭了卡片输入页,再执行setState操作,如果当前页面已经随路由销毁,会触发上下文非法异常。
修复建议调整执行顺序:
void _cardNonceRequestSuccess(CardDetails result) { print('Testing nonce'); // 先处理业务逻辑再关闭卡片页 setState(() { nonce = result.nonce; }); print(result.nonce); InAppPayments.completeCardEntry( onCardEntryComplete: _cardEntryComplete, ); }
另外确认squareTwoButtonPopup传入的context是当前活跃页面的合法上下文,不要使用已经销毁的页面上下文弹窗。
内容的提问来源于stack exchange,提问作者Doing Things Occasionally
相关产品推荐
相关产品推荐

