Я тестирую аутентификацию с мобильным приложением. Я использую службу аутентификации Firebase. Я проверил его один раз перед использованием устройства Android, и хотел бы протестировать его снова. Шаги заключаются в следующем: < /p>
Приложение запускает экран аутентификации (Firebaseui auth) < /li>
Если это первый раз, когда пользователь вошел в систему, это приведет их к экрану фрагмента, чтобы создать свое USERNAME < /li>
, это приведет их на главный экран. /> < /ol>
Код для этого ниже: < /p>
class LoginFragment: Fragment() {
private val TAG = "LoginFragment"
private var _binding: FragmentLoginBinding? = null
private val binding
get() = checkNotNull(_binding) {
"Cannot access binding because it is null, is the view visible?"
}
private val loginViewModel: LoginViewModel by viewModels()
// Creates ActivityResultLauncher to register a callback for FirebaseUI Activity result contract
private val signInLauncher = registerForActivityResult(
FirebaseAuthUIActivityResultContract(),
) { res ->
this.onSignInResult(res)
}
// Authentication providers
val providers = arrayListOf(
AuthUI.IdpConfig.EmailBuilder().build(),
AuthUI.IdpConfig.GoogleBuilder().build()
)
//creates custom layout
val customLayout = AuthMethodPickerLayout.Builder(R.layout.fragment_login)
.setGoogleButtonId(R.id.google_sign_in)
.setEmailButtonId(R.id.email_sign_in)
.build()
// Creates and launches sign-in intent
val signInIntent = AuthUI.getInstance()
.createSignInIntentBuilder().setAvailableProviders(providers)
.setIsSmartLockEnabled(false, true).setAuthMethodPickerLayout(customLayout).build()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentLoginBinding.inflate(inflater, container, false)
return binding.root
}
override fun onStart() {
super.onStart()
val currentUser = FirebaseAuth.getInstance().currentUser
if (currentUser == null) {
signInLauncher.launch(signInIntent)
} else {
Log.e("Auth", "onStart action_login_to_mainline")
findNavController().navigate(R.id.action_login_to_mainline)
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
val response = result.idpResponse
if (result.resultCode == RESULT_OK) {
//successfully signed in, set up username if first time logging in
//TODO: if user has already signed in, redirect to login with a message
val user = FirebaseAuth.getInstance().currentUser
val db = FirebaseFirestore.getInstance()
db.collection("users").document(user!!.uid).get()
.addOnSuccessListener { document ->
if (!document.exists()) {
// User doesn't exist in Firestore, treat as new user
Log.d("Auth", "User not found in Firestore, navigating to username setup")
findNavController().navigate(R.id.action_login_to_setusername)
} else {
// User exists in Firestore, proceed to main screen
Log.d("Auth", "User found in Firestore, navigating to main")
findNavController().navigate(R.id.action_login_to_mainline)
}
}
.addOnFailureListener { e ->
Log.e("Auth", "Error checking user existence: ${e.message}", e)
// Important: Add navigation to username setup here as fallback
findNavController().navigate(R.id.action_login_to_setusername)
}
}
}
< /code>
} < /p>
Все 3 шага были успешно выполнены в первый раз, когда я его тестировал. Я изменил несколько вещей с учетом пользовательского интерфейса и хотел бы протестировать его снова, но шаг 2 пропускается. Это происходит в OnStart (), и он выполняет еще, когда я хочу, чтобы он выполнил if. Как это исправить? База данных < /li>
< /ul>
Я удаляю приложение на своем устройстве каждый раз, когда пытаюсь протестировать его. Я уверен, что в базе данных или аутентификаторе ничего не хранится, так как он отображается как пустое на платформе Google Cloud. Если требуется дополнительная информация, дайте мне знать! Я потерялся в отношении того, что делать.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... en-testing