Flutter集成Supabase实现Google登录在Google Play发布版中崩溃求助
各位开发小伙伴们,我最近碰到一个棘手的问题,想请教下大家:我通过supabase_flutter包实现了Google登录功能,代码放在下面了。本地连设备调试的时候完全正常,iOS不管是debug还是release模式也都能顺利登录,但把App发布到Google Play商店之后,用户反馈登录时直接崩溃,我通过Crashlytics拿到的错误日志是这样的:
Fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: PlatformException(sign_in_failed, l5.b: 10: , null, null) at GoogleSignInApi.signIn(messages.g.dart:221) at GoogleSignInAndroid._signInUserDataFromChannelData(google_sign_in_android.dart:111) at GoogleSignIn._callMethod(google_sign_in.dart:278) at GoogleSignIn.signIn.isCanceled(google_sign_in.dart:431)
预期行为:正常通过Google账号登录App
实际问题:发布到Google Play后触发上述崩溃
我的实现代码如下:
Future<AuthResponse> _googleSignIn() async { /// Web Client ID registered with Google Cloud. const webClientId = 'XXXX.apps.googleusercontent.com'; /// iOS Client ID registered with Google Cloud. const iosClientId = 'YYYY.apps.googleusercontent.com'; late GoogleSignIn googleSignIn; if (Platform.isAndroid) { googleSignIn = GoogleSignIn(); } else { googleSignIn = GoogleSignIn( clientId: iosClientId, serverClientId: webClientId, ); } final googleUser = await googleSignIn.signIn(); final googleAuth = await googleUser!.authentication; final accessToken = googleAuth.accessToken; final idToken = googleAuth.idToken; if (accessToken == null) { throw 'No Access Token found.'; } if (idToken == null) { throw 'No ID Token found.'; } return supabase.auth.signInWithIdToken( provider: OAuthProvider.google, idToken: idToken, accessToken: accessToken, ); }
我整理了几个可能的排查方向,大家可以参考:
Google Cloud控制台的Android客户端指纹配置错误
这是最常见的坑!调试版和发布版用的是不同的签名证书,你需要把Google Play发布版的SHA-1指纹添加到Google Cloud的OAuth客户端配置里。如果你的App用了Google Play应用签名,那SHA-1要从Google Play控制台的「应用签名」标签页里获取,而不是你本地签名文件的指纹。然后去Google Cloud的「API和服务」->「凭据」里,找到对应的Android OAuth客户端ID,把这个发布版SHA-1加进去。ProGuard/R8混淆破坏了Google登录相关代码
发布版开启混淆后,可能会把Google登录依赖的类给混淆掉,导致运行时找不到方法。你需要在proguard-rules.pro里添加以下规则:-keep class com.google.android.gms.auth.** { *; } -keep class com.google.android.gms.common.** { *; } -keep class com.google.firebase.auth.** { *; } -keep class io.flutter.plugins.googlesignin.** { *; }Supabase控制台的OAuth配置不完整
去Supabase控制台的「Authentication」->「Providers」->「Google」里,检查是否正确添加了Android的客户端ID,并且包名和你发布版的包名完全一致,不能有拼写错误。Android端未指定正确的Client ID
你的代码里Android端初始化GoogleSignIn时没有传clientId或serverClientId,虽然调试时可能用google-services.json里的配置,但发布版可能需要显式指定对应的Android客户端ID(在Google Cloud里创建的那个Android类型的客户端ID),可以试试修改Android端的初始化代码:if (Platform.isAndroid) { googleSignIn = GoogleSignIn( serverClientId: webClientId, // 或者填Android的客户端ID,根据你的配置来 ); }
希望这些方向能帮到你解决问题,有其他细节也可以补充出来一起讨论!
备注:内容来源于stack exchange,提问作者user33629

