#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)
}
}
}
}
В первый раз, когда я вызываю этот метод (после того, как пользователь зарегистрировался в первый раз), все работает отлично, и электронное письмо отправляется почти сразу. Сейчас я провожу некоторое ручное тестирование и хочу проверить, правильно ли обновляется мой пользовательский интерфейс при неудачной отправке электронного письма. Я делаю это, отключая Интернет до того, как пользователь нажмет кнопку «отправить еще раз». Это будет поток тестирования:
- Зарегистрируйте нового пользователя, но не проверяйте его.
- Пользовательский интерфейс обновится, сообщив: «Вы должны подтвердить свою электронную почту, чтобы продолжить», и появится кнопка «отправить еще раз» (все хорошо).
- Отключите Интернет (имитируя ситуацию, когда электронное письмо не может быть отправлено, и задача завершится неудачно).
- Нажмите кнопку «отправить еще раз».
Ожидаемый результат
Задача немедленно завершится неудачей и OnFailureListener
сработает.
Фактический результат
Обработка задачи занимает несколько минут, пока в конечном итоге OnFailureListener
не сработает.
Это ошибка? Плохая обработка тайм-аута для sendEmailVerification
задачи?
Могу ли я что-нибудь сделать, кроме как самостоятельно отслеживать состояние сети?
Комментарии:
1. Хотя доставка электронной почты может занять некоторое время, вызов API не должен занимать много времени. Можете ли вы включить в свой код некоторые записи, которые показывают время, а затем включить обновленный код и его вывод logcat в свой вопрос?
2. @FrankvanPuffelen я могу попробовать. но обратите внимание, что время занимает не отправка электронной почты, а завершение
Task
объекта и запуск прослушивателя сбоев. на самом деле, электронное письмо вообще не должно отправляться в описываемом мной сценарии (потомуTask
что это невозможно выполнить без подключения к Интернету)3. Я также столкнулся с этой проблемой и вместо этого переопределил настройки smtp с помощью sendgrid
Ответ №1:
Это может быть ожидаемым поведением, поскольку задача пытается повторно доставить вызов на сервер до сбоя. Это делается, поскольку многие пользователи испытывают регулярные кратковременные сбои в подключении к Интернету, и сбой вызова API приведет к ухудшению работы.
Если вы хотите работать в автономном режиме по-другому, вам придется самостоятельно проверить подключение к Интернету перед вызовом Firebase API.
Комментарии:
1. прекрасно, что задача повторяет попытку отправки электронной почты. но я думаю, что время ожидания не должно составлять несколько минут. есть ли способ проверить, что это просто из-за сверхдлинного тайм-аута?
Ответ №2:
На случай, если у кого-то еще есть эта проблема: к сожалению, я не нашел правильного решения, поэтому в итоге я вручную проверил состояние соединения перед запуском процесса входа