Обработка ошибок аутентификации Firebase в единстве - PullRequest
0 голосов
/ 06 марта 2020

Я изо всех сил пытался найти решение для этого, и мне кажется, что я делаю что-то неправильно из-за моего ограниченного знания, поэтому вот проблема:

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, она очень проста: функция FetchRegisterInputValues(); получает электронную почту и пароли, CheckRegisterDataIntegrity() сравнивает пароль с подтверждением пароля в форме, и, наконец, HandleRegistrationErrors(task.Exception); предназначен для запустить всплывающую панель, чтобы показать ошибку,

вот так HandleRegistrationErrors(task.Exception); выглядит

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

он использует актив пользовательского интерфейса из хранилища активов, .OpenNotification(); запускает анимацию и выскакивает это, а затем я просто показываю сообщение.

Теперь у меня есть две проблемы , первая - когда возникает ошибка, с которой столкнулась Firebase, и условие if (task.IsFaulted) истинно, функция HandleRegistrationErrors должна быть вызвана, верно? ну, это именно то, что происходит, за исключением того, что вызывается только строка print("it's here from the errors method " + errMsg.Message);, а остальная часть функции не выполняется, сначала я подумал, что это проблема с активом, но я попытался сделать это вручную (создал собственный пользовательский интерфейс с единицей и использовал метод SetActive () для запуска всплывающего окна), но опять-таки выполняется только метод печати, я думаю, что из-за CreateUserWithEmailAndPasswordAsync является асинхронным, и я должен соответствующим образом обрабатывать ошибки, но я действительно не знаю, как go об этом и нет документации, которую я мог бы найти. Вторая проблема заключается в том, как получить правильное сообщение об ошибке, поскольку task.Exception.Message всегда возвращает мне сообщение «Произошла одна или несколько ошибок». в то время как task.Exception само дает правильное сообщение, но оно не отформатировано правильно.

1 Ответ

0 голосов
/ 06 марта 2020

Первый вопрос самый простой. Чтобы обновить код с минимальными затратами усилий, просто замените ContinueWith на ContinueWithOnMainThread, и logi c принудительно войдет в основной поток. Кроме того, вам следует избегать вызова task.Result, если task.Exception не равно нулю, так как это просто вызовет исключение (см. Документацию ).

Для материала, связанного с потоками: I go, чтобы узнать больше о многопоточности с Firebase и Unity здесь , и вы можете прочитать о ContinueWithOnMainThread расширении здесь .

Для вашего второго выпуска, Проблема, с которой вы сталкиваетесь, заключается в том, что task.Exception является AggregateException . Обычно я просто присоединяю отладчик и проверяю его при отладке (или позволяет Crashlytics анализировать его в поле), и мое состояние пользовательского интерфейса касается только успеха или неудачи. Если вы хотите проверить ошибку, в документации, которую я связал для AggregateException, рекомендуется сделать что-то вроде:

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

Хотя я бы поиграл с .Flatten() или .GetBaseException(), чтобы увидеть, проще ли с ними справиться с.

Надеюсь, это поможет!

- Патрик

...