【问题标题】:Unity+Firebase hangs from user.TokenAsyncUnity+Firebase 从 user.TokenAsync 挂起
【发布时间】:2018-10-22 04:30:21
【问题描述】:

以下是我在统一的 firebase 中的主要登录块。当我摆脱它时它工作正常:
Debug.Log(user.TokenAsync(false).Result);
但是,出于安全考虑,我必须有办法处理会话。 Firebase 甚至建议您采用这种方式。无论您做什么,无论是假还是真,应用程序都会挂起并且永远不会继续。我是否错误地使用了 tokenasync?
我也尝试过使用注释掉的内容:
//StatusText.text = FirebaseAuth.DefaultInstance.CurrentUser.TokenAsync(true).Result;
但是当前用户由于某种原因返回 null

FirebaseUser InvalidVerificationUser;
public void OnLoginButtonPressed()
{
    LoginButton.interactable = false;
    StatusText.text = "Logging in, please wait...";
    FirebaseAuth.DefaultInstance.SignInWithEmailAndPasswordAsync(Email.text, Password.text).ContinueWith((obj) =>
    {
        if (obj.IsFaulted || obj.IsCanceled)
        {
            StatusText.text = obj.Exception.InnerExceptions[0].ToString().Substring(28);
            LoginButton.interactable = true;
            return;
        }
        else if (!obj.Result.IsEmailVerified)
        {
            StatusText.text = "You must verify your email before logging in";
            ResendObject.SetActive(true);
            InvalidVerificationUser = obj.Result;
            LoginButton.interactable = true;
            return;
        }

        FirebaseUser user = obj.Result;
        if (user.DisplayName == "")
        {
            StatusText.text = "CRITICAL: No Username Found!";
        }
        else
            StatusText.text = "Hello: " + user.DisplayName;
        LoginButton.interactable = true;
        Debug.Log(user.TokenAsync(false).Result);
    });
    //StatusText.text = FirebaseAuth.DefaultInstance.CurrentUser.TokenAsync(true).Result;
}

【问题讨论】:

  • 您忘记了 { }else 声明。请注意,StatusText.text = "Hello: " + user.DisplayName 将在 else 时执行 LoginButton.interactable = trueDebug.Log(user.TokenAsync(false).Result) 将始终执行。你确定那是你想要的吗?我怀疑那里有 null 问题
  • 实际上我没有忘记 { } 因为我不希望其他 2 行只在 else 中工作。但是我知道这不是一个空问题,因为当我成功时它仍然挂起

标签: c# firebase unity3d firebase-authentication


【解决方案1】:

我在 SignInAnonymouslyAsync 挂起 Unity 客户端时遇到了同样的问题,我通过等待 SignInAnonymouslyAsyncTokenAsync 解决了这个问题。

这样的事情可能会对你有所帮助:

FirebaseUser firebaseUser = await AuthDefaultInstance.SignInWithEmailAndPasswordAsync(Email.text, Password.text);

if (!firebaseUser.IsEmailVerified)
{
    // do stuff here
}
else if (firebaseUser.DisplayName == string.Empty)
{
    // do stuff here
}
else
{
    string token = await firebaseUser.TokenAsync(true);
}

【讨论】:

    【解决方案2】:

    重点是TokenAsync是返回Task的API

    所以,大家千万不要直接使用Task 对象的.Result,这是常见的做法。任何任务不仅仅是 firebase api。尤其是团结。它倾向于用死锁来冻结应用程序

    改用async/awaittask.ContinueWith(callBack)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2021-08-21
      • 2018-02-20
      • 1970-01-01
      • 2020-01-14
      • 2023-03-25
      • 2017-01-29
      相关资源
      最近更新 更多