Firebase身份验证错误统一处理

时间:2020-03-06 15:28:26

标签: firebase unity3d asynchronous error-handling firebase-authentication

我一直在努力寻找解决方案,由于我的知识面有限,我似乎在以错误的方式做某事,所以这是问题的根源:

public void RegisterNewUser()
{        
    FetchRegisterInputValues();        
    if (CheckRegisterDataIntegrity())
    {
        _auth.CreateUserWithEmailAndPasswordAsync(_email, _password).ContinueWith(task => {
            if (task.IsCanceled) {
                Debug.LogError("CreateUserWithEmailAndPasswordAsync was canceled.");
                return;
            }
            if (task.IsFaulted)
            {
                HandleRegistrationErrors(task.Exception);              
                return;
            }                                
            // Firebase user has been created.
            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("Firebase user created successfully: {0} ({1})",
                newUser.DisplayName, newUser.UserId);
        });
    }
    else if (!CheckRegisterDataIntegrity())
    {
        HandleRegistrationErrors(new AggregateException("passwords do not match"));
    }
}

上面是我从Firebase文档中直接获得的Registration函数,它非常简单 FetchRegisterInputValues();函数获取电子邮件和密码,CheckRegisterDataIntegrity()将密码与表单中的密码构型进行比较,最后HandleRegistrationErrors(task.Exception);旨在触发一个弹出面板以显示错误,< / p>

HandleRegistrationErrors(task.Exception);的外观

private void HandleRegistrationErrors(AggregateException errMsg)
{       
    print("its here from the errors method " + errMsg.Message);
    registerErrorPopup.OpenNotification();
    registerErrorPopup.description = errMsg.Message;
}

它正在使用资产商店中的UI资产,.OpenNotification();启动动画并弹出它,然后我只是显示消息。

现在,我遇到两个问题,第一个是当Firebase遇到错误并且if (task.IsFaulted)条件为true时,应调用HandleRegistrationErrors函数,对?。好吧,这确实是发生了什么,除了仅调用print("it's here from the errors method " + errMsg.Message);行而其他函数未执行之外,我起初以为这是资产问题,但我尝试手动进行(创建了一个本机UI团结一致,并使用SetActive()方法启动popUp),但再次仅执行print方法,我认为这是因为 CreateUserWithEmailAndPasswordAsync是异步的,我应该相应地处理错误,但是我真的不知道该如何处理,并且没有文档可以找到。 第二个问题是由于task.Exception.Message总是会向我返回“发生一个或多个错误”,因此如何获取正确的错误消息。而task.Exception本身给出了正确的消息,但格式不正确。

1 个答案:

答案 0 :(得分:0)

第一个问题是最简单的。要以最小的工作量更新代码,只需将ContinueWith替换为ContinueWithOnMainThread即可将逻辑强加到主线程上。另外,如果task.Result不为null,则应避免调用task.Exception,因为它只会引发异常(请参见related documentation)。

对于与线程相关的内容:我将详细介绍Firebase和Unity here的线程,您可以阅读有关ContinueWithOnMainThread扩展名here的信息。

对于第二个问题,您遇到的问题是task.ExceptionAggregateException。我通常只是附加一个调试器,并在调试时(或现场的let Crashlytics analyze it)进行检查,并且我的UI状态仅关注成功或失败。如果您想检查错误,我为AggregateException链接的文档建议执行以下操作:

task.Exception.Handle((e) => Debug.LogError($"Failed because {e}"));

尽管我会使用.Flatten().GetBaseException()来看看它们是否更易于处理。

我希望这会有所帮助!

-帕特里克