Unity应用程序崩溃,当与谷歌登录,使用Firebase

p8h8hvxi  于 2023-10-22  发布在  其他
关注(0)|答案(7)|浏览(181)

我正试图添加一个'登录与谷歌'选项到我的应用程序,使用firebase。然而,当我点击按钮,调用我的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
将感谢所有帮助解决这个问题,并获得登录与谷歌选项工作.
我发现我的代码在这里中断:

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

这是OnAuthenticationFinished方法:

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

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

dz6r00yl

dz6r00yl1#

我是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()。

yrdbyhpb

yrdbyhpb2#

我想我看到你的问题了。OnAuthenticationFinished很可能在后台触发,而AddToInformation正在改变UnityEngine中的某些东西(即更新infoText.text)。
如果将ContinueWith替换为ContinueWithOnMainThread,它可能会正常工作。我建议您现在对代码中的所有ContinueWith示例都这样做。它可能效率稍低(你在游戏线程上工作),但在Unity中也更安全。否则,我需要查看日志来找出问题所在。请参阅this blog post了解更多信息。

rqmkfv5c

rqmkfv5c3#

我也面临着同样的问题,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
    }
rt4zxlrg

rt4zxlrg4#

在我的情况下,这是一个r8/proguard的问题。我已经将这些行添加到proguard规则中,它停止了崩溃:

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

3zwtqj6y5#

你好,我使用相同的脚本,有同样的问题。这个问题背后的原因是“AddToInformation()“是变异的东西在团结引擎作为帕特里克说。
最简单的解决方案是从脚本中注解/删除“AddToInformation()“函数。它只是为了调试的目的,不会影响功能。

ncecgwcz

ncecgwcz6#

我有一个问题与建成APK崩溃在年底.这个问题是与依赖和我解决了它改变设置资产>外部依赖管理器> android >设置。关闭自动分辨率。然后删除.aar文件。然后我解决了依赖关系。这解决了我的问题,我希望这有帮助。欲了解更多信息
Firebase for Unity sample app crashes with: Could not find class 'com.google.android.gms.common.api.PendingResult'

8zzbczxx

8zzbczxx7#

对我来说,我必须在登录前的一行代码中使用FirebaseAuth.DefaultInstance,否则,它每次都会崩溃。

_ = FirebaseAuth.DefaultInstance;

Credential credential = GoogleAuthProvider.GetCredential( [...] );

相关问题