Обновление: проблема исчезла, когда все пользователи, столкнувшиеся с этой проблемой, сменили оператора мобильной связи. Проблема не возникла, когда они вернулись к первоначальному носителю. Хотя сейчас все работает, было бы полезно, если бы я определил причину ошибки, чтобы в будущем ее можно было правильно обработать
Пользователи в моем приложении входят в систему через проверку подлинности телефона Firebase. Раньше все работало нормально, поскольку некоторые пользователи, которые ранее входили в приложение, но впоследствии их данные были удалены, не могут войти в систему после sh. Процесс аутентификации и входа в систему перестали работать для этих пользователей. Сначала я предоставлю код, а затем подробно напишу, что я выяснил до сих пор. Я делаю тосты (не регистрирую, потому что эти пользователи являются удаленными), чтобы понять процесс.
Сначала я проверяю введенный номер телефона:
fun verify(){
verificationCallBacks()
val mobile = "+91"+MobileNumber.text.toString()
PhoneAuthProvider.getInstance().verifyPhoneNumber(
mobile,
60,
TimeUnit.SECONDS,
this,
mCallbacks
)
}
fun verificationCallBacks(){
mCallbacks = object: PhoneAuthProvider.OnVerificationStateChangedCallbacks(){
override fun onVerificationCompleted(credential: PhoneAuthCredential) {
Toast.makeText(this@Login, "Automatic", Toast.LENGTH_LONG).show()
signIn(credential)
}
override fun onVerificationFailed(p0: FirebaseException) {
Toast.makeText(this@Login, p0.toString(), Toast.LENGTH_SHORT).show()
}
override fun onCodeSent(p0: String, p1: PhoneAuthProvider.ForceResendingToken) {
Toast.makeText(this@Login, "Verification ", Toast.LENGTH_LONG).show()
super.onCodeSent(p0, p1)
verificationID = p0
}
}
}
После проверочных обратных вызовов, на В обычные дни некоторые пользователи автоматически входят в систему, а некоторые проходят проверку подлинности с помощью проверочного SMS. Код для входа в систему и аутентификации (вход в систему через SMS для проверки):
fun authenticate(){
if(Verification.text.toString().trim().isNotEmpty()) {
val verifyCode = Verification.text.toString()
val credential: PhoneAuthCredential =
PhoneAuthProvider.getCredential(verificationID, verifyCode)
signIn(credential)
}
}
fun signIn(credential: PhoneAuthCredential){
mAuth.signInWithCredential(credential)
.addOnCompleteListener {
task: Task<AuthResult> ->
if(task.isSuccessful){
saveUserToFirebaseDatabase()
}else{
if (task.exception is FirebaseAuthInvalidCredentialsException) {
Toast.makeText(this@Login, "Error Logging you in", Toast.LENGTH_SHORT).show()
}
}
}
}
После метода входа в систему пользователь сохраняется в базе данных, если он не существует, или он существует, тогда обновляется что-то еще следующим образом:
fun saveUserToFirebaseDatabase(){
val uid = mAuth.uid ?: ""
ref1 = newref.child(uid)
Toast.makeText(this@Login, uid, Toast.LENGTH_LONG).show()
listenerA1 = ref1.addValueEventListener(object : ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
Toast.makeText(this@Login, p0.message, Toast.LENGTH_LONG).show()
}
override fun onDataChange(p0: DataSnapshot) {
if(p0.exists()){
**** Do Something *****
}else{
**** Do Something *****
}
}
})
}
Для пользователей, которых я описал ранее, я вижу, что для них аутентификация завершена, но они не могут подключиться к базе данных. Последовательность выполнения кода, которую я смог выяснить, выглядит следующим образом:
1) При обратном вызове проверки запускаются оба автоматических c входа (onVerificationCompleted) и проверочные SMS (onCodeSent). Я не уверен, так ли это.
2) Автомат c signIn напрямую переносит выполнение в функцию signIn.
3) В функции signIn генерируется uid , который отображается. Но после этого слушатель пожарной базы не присоединяется. Следовательно, пользователь не может подключиться к базе данных. Сообщение об ошибке p0.message не отображается при ошибке базы данных.
4) Тем временем пользователь также получает проверочный код. Он вводит то же самое, и выполнение снова приводит его к функции входа в систему. Но затем он получает сообщение «Ошибка входа в систему». Эта ошибка возникает из-за того, что Firebase генерирует недопустимое исключение, так как «отправленное SMS истекло»
В течение последних 48 часов я ломаю голову над головой, не в состоянии понять, почему это происходит. Может кто-нибудь, пожалуйста, помогите