使用 firebase 通过 google 登录时,unity 应用程序崩溃

问题描述 投票:0回答:7

我正在尝试使用 firebase 在我的应用程序中添加“使用 google 登录”选项。但是,当我单击在 Android 设备上调用登录脚本的按钮时,应用程序崩溃并完全关闭。

我无法在编辑器中运行此脚本。那么还有其他方法可以找出错误是什么吗?

我正在使用此处找到的脚本https://www.dropbox.com/s/qss2wk4v52d48j4/GoogleSignInDemo.cs?dl=0 并从我的 firebase 项目中获取了 Web 客户端 ID,并启用了 google 登录。

我还将 sha1 指纹添加到我的 firebase 项目中,并将 google-services.json 文件复制到我的 unity 项目中。 我使用的是Unity 2020.1.6f1 我的 firebase 软件包版本为 7.0.1 和谷歌登录插件 1.0.4

非常感谢有关解决此问题并使用 google 选项登录的所有帮助。

我发现我的代码在这里中断:

 GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnAuthenticationFinished);

这是 OnAuthenticationFinished 方法:

internal void OnAuthenticationFinished(Task<GoogleSignInUser> task){}

我将其留空以确保问题不在方法内部

firebase unity-game-engine google-signin
7个回答
1
投票

我是 C# 和 Unity 初学者。 我相信 OnAuthenticationFinished 在后台线程中运行(与 Unity 主线程的区别)。 如果您在 OnAuthenticationFinished() 中更新 UI 或打印日志会导致崩溃。

我通过将 OnAuthenticationFinished() 中的值保存到变量来解决这个问题。并在 Update() 中使用它们

private string idToken;
private bool errorMessage;

void OnAuthenticationFinished(Task<GoogleSignInUser> task)
{
  if (task.IsFaulted) {
   err = true;
   return;
  }
  idToken = task.Result.IdToken;
    
}


private void Update()
{
    if (!String.IsNullOrEmpty(idToken))
    {
        // Handle login successfully
        idToken = null;
        return;
    }

    if (err)
    {
        // Show err
      err = false;
    }
}

      

️或者你可以像 Digvijaysinh Gohil 一样使用 Corrountine() 。


0
投票

认为我看到你的问题了。

OnAuthenticationFinished
可能会在后台触发,并且
AddToInformation
正在改变
UnityEngine
中的某些内容(即更新
infoText.text
)。

如果将

ContinueWith
替换为
ContinueWithOnMainThread
,它可能会起作用。我建议现在对代码中所有
ContinueWith
实例执行此操作。它的效率可能稍低(您正在游戏线程上工作),但在 Unity 中也更安全。否则我需要查看日志才能找出问题所在。请参阅此博文了解更多信息。


0
投票

面临着同样的问题,

ContinueWithOnMain
也不适合我,所以我基本上定义了协程,并让它们在执行其他指令之前等待帧结束

这是我做的代码

FirebaseAuthHandler.instance.GetAuth().SignInWithCredentialAsync(credential).ContinueWith(authTask =>
                {
                    if (authTask.IsCanceled)
                    {
                        signInCompleted.SetCanceled();
                        Debug.Log("Task canceled");
                    }
                    else if (authTask.IsFaulted)
                    {
                        signInCompleted.SetException(authTask.Exception);
                        StartCoroutine(OnFailure(authTask.Exception));
                    }
                    else
                    {
                        signInCompleted.SetResult(authTask.Result);                            
                        StartCoroutine(OnSuccess(authTask.Result));
                    }
                });

协程如下

    private IEnumerator OnSuccess(FirebaseUser authTaskResult)
    {
        yield return new WaitForEndOfFrame();
        Debug.Log("OnSuccess");
        // Do stuff here
    }

    private IEnumerator OnFailure(AggregateException authTaskException)
    {
        yield return new WaitForEndOfFrame();
        // Do stuff here
    }

0
投票

就我而言,这是一个 r8/proguard 问题。我已将这些行添加到混淆器规则中,它不再崩溃:

-keep class com.google.googlesignin.** { *; }
-keep class com.google.android.gms.auth.** { *; }

0
投票

您好,我使用相同的脚本并遇到相同的问题。这个问题背后的原因是“

AddToInformation()
”正在改变统一引擎中的某些内容,正如帕特里克所说。
最简单的解决方案是从脚本中注释/删除“
AddToInformation()
”函数。它仅用于调试目的,不会影响功能。


0
投票

我遇到了构建的 APK 最后崩溃的问题。问题在于依赖性,我通过更改“资产”>“外部依赖项管理器”>“android”>“设置”上的设置来解决它。并关闭自动分辨率。然后删除 .aar 文件。之后我解决了依赖关系。这解决了我的问题,希望有帮助。了解更多信息

Firebase for Unity 示例应用程序崩溃:无法找到类“com.google.android.gms.common.api.PendingResult”


0
投票

对我来说,登录之前我必须在一行代码中使用

FirebaseAuth.DefaultInstance
,否则每次都会崩溃。

_ = FirebaseAuth.DefaultInstance;

Credential credential = GoogleAuthProvider.GetCredential( [...] );
© www.soinside.com 2019 - 2024. All rights reserved.