You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Supabase实现Google登录在Google Play发布版中崩溃求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:13:08