задача проверки подлинности firebase sendVerificationEmail () длится вечно

#android #firebase-authentication #kotlin-android-extensions

# #Android #firebase-аутентификация #kotlin-android-extensions

Вопрос:

Я новичок в аутентификации на базе firebase и внедряю поток входа в систему, используя FirebaseUI свое приложение для Android. В рамках процесса я отправляю пользователю электронное письмо с подтверждением и нажимаю кнопку «отправить еще раз» для отправки другого электронного письма на случай, если пользователь не получил первое. Я отправляю электронные письма, используя этот метод:

 fun sendVerificationEmail() {
    if (!isSignedIn()) {
        verificationEmailFailed("cannot send verification email. FirebaseAuth user was null.")
    } else {
        //isSignedIn() returned 'true', so currentUser should not be null
        auth.currentUser!!.apply {
            sendEmailVerification()
                .addOnSuccessListener {
                    Log.d(TAG, "verification email successfully sent to $email")
                }
                .addOnFailureListener {
                    verificationEmailFailed(
                        "FAILED to send verification email to $email: ${it.message}", it)
                }
        }
    }
}
 

В первый раз, когда я вызываю этот метод (после того, как пользователь зарегистрировался в первый раз), все работает отлично, и электронное письмо отправляется почти сразу. Сейчас я провожу некоторое ручное тестирование и хочу проверить, правильно ли обновляется мой пользовательский интерфейс при неудачной отправке электронного письма. Я делаю это, отключая Интернет до того, как пользователь нажмет кнопку «отправить еще раз». Это будет поток тестирования:

  1. Зарегистрируйте нового пользователя, но не проверяйте его.
  2. Пользовательский интерфейс обновится, сообщив: «Вы должны подтвердить свою электронную почту, чтобы продолжить», и появится кнопка «отправить еще раз» (все хорошо).
  3. Отключите Интернет (имитируя ситуацию, когда электронное письмо не может быть отправлено, и задача завершится неудачно).
  4. Нажмите кнопку «отправить еще раз».

Ожидаемый результат

Задача немедленно завершится неудачей и OnFailureListener сработает.

Фактический результат

Обработка задачи занимает несколько минут, пока в конечном итоге OnFailureListener не сработает.

Это ошибка? Плохая обработка тайм-аута для sendEmailVerification задачи?

Могу ли я что-нибудь сделать, кроме как самостоятельно отслеживать состояние сети?

Комментарии:

1. Хотя доставка электронной почты может занять некоторое время, вызов API не должен занимать много времени. Можете ли вы включить в свой код некоторые записи, которые показывают время, а затем включить обновленный код и его вывод logcat в свой вопрос?

2. @FrankvanPuffelen я могу попробовать. но обратите внимание, что время занимает не отправка электронной почты, а завершение Task объекта и запуск прослушивателя сбоев. на самом деле, электронное письмо вообще не должно отправляться в описываемом мной сценарии (потому Task что это невозможно выполнить без подключения к Интернету)

3. Я также столкнулся с этой проблемой и вместо этого переопределил настройки smtp с помощью sendgrid

Ответ №1:

Это может быть ожидаемым поведением, поскольку задача пытается повторно доставить вызов на сервер до сбоя. Это делается, поскольку многие пользователи испытывают регулярные кратковременные сбои в подключении к Интернету, и сбой вызова API приведет к ухудшению работы.

Если вы хотите работать в автономном режиме по-другому, вам придется самостоятельно проверить подключение к Интернету перед вызовом Firebase API.

Комментарии:

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

Ответ №2:

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