Unity集成Firebase Google登录报GoogleSignInException错误及解决方法
Unity Firebase Google登录问题(已解决)
已解决说明
编辑:已解决问题
问题出在密钥上。将应用上传至Google控制台,并使用了应用完整性下的SHA1密钥后问题解决。
问题背景
我是Unity及Firebase/GoogleSignIn的新手,正尝试在Unity中基于Firebase搭建Google登录按钮。
使用环境:
- Unity 2021.3.6f1
- 目标平台:Android 6+
- 脚本后端:IL2CPP
- 平台API兼容等级:.Net Standard 2.1
- 目标架构:ARMv7 & ARM64
- 非开发构建,Firebase项目设置中Prod-Tag未标记为生产环境
操作步骤
- 使用PlayerSettings中的包名创建Unity Firebase项目;
- 下载
google-services.json并添加至资源文件夹; - 下载Firebase Unity SDK 9.3.0的
FirebaseAuth.unitypackage及google-signin-plugin-1.0.4.unitypackage,导入Unity(跳过Google登录插件的Parse,删除FirebaseAuth中Net 3.5的unity.tasks.dll和unity.compat.dll); - 启用认证功能 -> 登录方式 -> Google(Web-Client-ID与
google-services.json中的一致); - 在Unity发布设置的密钥库管理器中生成密钥库,通过Java keytool读取SHA-256指纹并添加至Firebase项目设置;
- 使用
google-services.json中类型为3的WebClient ID OAuth客户端ID; - 构建应用并安装到手机后,抛出以下错误:
DeveloperError Exception of type 'Google.GoogleSignIn+SignInException' was thrown.
代码实现
using UnityEngine; using UnityEngine.UI; using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using Firebase; using Firebase.Auth; using Firebase.Extensions; using Google; using System.Net.Http; public class FirebaseGoogleLogin : MonoBehaviour { public Text warning; public Animator anWarning; private bool fireBaseReady; private GoogleSignInConfiguration configuration; Firebase.DependencyStatus dependencyStatus = Firebase.DependencyStatus.UnavailableOther; Firebase.Auth.FirebaseAuth auth; Firebase.Auth.FirebaseUser user; void Awake() { configuration = new GoogleSignInConfiguration { WebClientId = "XXX from google-services.json", RequestIdToken = true }; } private void Start() { auth = Firebase.Auth.FirebaseAuth.DefaultInstance; } public void OnSignIn() { GoogleSignIn.Configuration = configuration; GoogleSignIn.Configuration.UseGameSignIn = false; GoogleSignIn.Configuration.RequestIdToken = true; GoogleSignIn.Configuration.RequestEmail = true; user = auth.CurrentUser; if (user != null) { warning.text = "User signed in successfully:" + user.Email + " " + user.UserId; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } else { GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnAuthenticationFinished); } } internal void OnAuthenticationFinished(Task<GoogleSignInUser> task) { //TaskCompletionSource<FirebaseUser> signInCompleted = new TaskCompletionSource<FirebaseUser>(); //signIn.ContinueWith(task => { if (task.IsCanceled) { warning.text = "1:" + task.Exception; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } else if (task.IsFaulted) //ERROR OCCURS HERE { using (IEnumerator<System.Exception> enumerator = task.Exception.InnerExceptions.GetEnumerator()) { if (enumerator.MoveNext()) { GoogleSignIn.SignInException error = (GoogleSignIn.SignInException)enumerator.Current; warning.text = "Got Error: " + error.Status + " " + error.Message; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } else { warning.text = "Got Unexpected Exception?!?" + task.Exception; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } } } else { warning.text = "3"; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); Credential credential = Firebase.Auth.GoogleAuthProvider.GetCredential(((Task<GoogleSignInUser>)task).Result.IdToken, null); auth.SignInWithCredentialAsync(credential).ContinueWith(authTask => { if (authTask.IsCanceled) { warning.text = "auth task canceled:" + authTask.Exception; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } else if (authTask.IsFaulted) { warning.text = "auth task is faulted:" + authTask.Exception; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } else { warning.text = "User signed in successfully:"; anWarning.Play("Base Layer.FontButtonFadeLong", 0, 0); } }); } // }); } }
OnSignIn由按钮点击触发。错误出现在internal void OnAuthenticationFinished(Task<GoogleSignInUser> task)的(task.IsFaulted)分支。
其他编译警告
除了FirebaseGoogleLogin.cs脚本中的以下错误外,Unity中无其他控制台/构建错误:
Error CS0433: The type 'Task' exists in both 'Unity.Tasks, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=XXX' Assembly-CSharp, Assembly-CSharp.Player
但有人说这是常见问题,不会造成影响。
经过大量时间排查,请问我哪里出错了?(注:后续已通过配置Google控制台SHA1密钥解决)
内容的提问来源于stack exchange,提问作者user5441400
相关产品推荐
相关产品推荐

