Flutter应用Firebase手机号登录仅Android发布模式报错排查
Flutter Android Release模式下Firebase手机号登录抛出Null类型错误
我的Flutter应用集成了Firebase手机号登录功能,iOS和Android的debug模式均运行正常,但仅在Android物理设备的release模式下抛出错误,iOS的release模式仍可正常工作。
错误日志
[+9626 ms] E/flutter (21573): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'String' [ ] E/flutter (21573): #0 MethodChannelFirebaseAuth.verifyPhoneNumber.<anonymous closure> (package:firebase_auth_platform_interface/src/method_channel/method_channel_firebase_auth.dart:655) [ ] E/flutter (21573): #1 _RootZone.runUnaryGuarded (dart:async/zone.dart:1593) [ ] E/flutter (21573): #2 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339) [ ] E/flutter (21573): #3 _DelayedData.perform (dart:async/stream_impl.dart:515) [ ] E/flutter (21573): #4 _PendingEvents.handleNext (dart:async/stream_impl.dart:620) [ ] E/flutter (21573): #5 _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:591) [ ] E/flutter (21573): #6 _microtaskLoop (dart:async/schedule_microtask.dart:40) [ ] E/flutter (21573): #7 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49) [ ] E/flutter (21573):
实现代码
Future verifyPhoneNumber() async { try { await FirebaseAuth.instance.verifyPhoneNumber( phoneNumber: _telNumberController.text, verificationCompleted: (PhoneAuthCredential credential) async { print('COMPLETED'); }, verificationFailed: (FirebaseAuthException e) { print('FAILED'); }, codeSent: ( String verificationId, int? resendToken, ) { print('CODE SENT'); }, codeAutoRetrievalTimeout: (String verificationId) {}, ); } catch (e) { print(e); } }
已确认手机号已正确传入,但verificationCompleted和verificationFailed的打印语句均未执行。
更新1:发现release版本的SHA1和SHA256与debug版本不同,已将其添加至Firebase后台,下载新的google-services.json并执行flutter clean,但问题仍存在,怀疑与release模式下无法完成re-Captcha验证有关。
更新2:已添加Google Play Store的SHA密钥,目前Firebase后台已包含debug、release及Google Play的SHA1和SHA256,但问题依旧。
更新3:发现将build.gradle中的配置从
signingConfig signingConfigs.debug
修改为
signingConfig signingConfigs.release
时问题出现,推测release签名配置存在问题。我的签名配置步骤如下:
- 通过命令创建上传密钥库:
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload - 在android目录下创建
key.properties文件:
storePassword=*** keyPassword=*** keyAlias=upload storeFile=/Users/amarchuk/upload-keystore.jks
- 在gradle的android代码块之前配置签名:
def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) }
- 在android代码块内配置:
signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } } buildTypes { release { signingConfig signingConfigs.release } }
请问签名配置中可能存在什么问题?
内容的提问来源于stack exchange,提问作者TonyWyomy
相关产品推荐
相关产品推荐

