我的 Android 应用程序中有一个单例,在应用程序启动时启动,它监听身份验证状态更改,如下所示:
fun listenForAuthChanges() {
if (authStateListener != null) {
FirebaseAuth.getInstance().removeAuthStateListener(authStateListener!!)
}
authStateListener = FirebaseAuth.AuthStateListener { auth ->
val user = auth.currentUser
writeStatusToFirebase()
if (user != null) {
Log.debug("User : ${user.uid} -> ${user.loginType}")
} else {
Log.debug("User : signed out")
loginAnonymously()
}
}
FirebaseAuth.getInstance().addAuthStateListener(authStateListener!!)
}
这非常有效,可以检测用户是否注销或登录。正如您在上面的代码中使用 loginAnonymously() 看到的,当没有用户登录时,我会自动匿名登录。然而,这一切就像一个魅力......当我调用 Firebase-UI 登录并且用户通过 Facebook 登录时,不会调用身份验证状态侦听器。
我发现 FirebaseUI 实际上不会创建新用户,而是将匿名用户升级为 Facebook 用户(在 Firebase Auth 控制台中检查并通过在 Android studio 控制台中使用断点)。这实际上就是我想要的行为。
所以我猜测,结论是Auth状态监听器没有被调用是因为用户的uid没有改变?
但是,我确实需要一种可靠的方法来检测此事件(意味着用户从匿名升级到例如 Facebook)。
最好的方法是什么?
注意:我知道可以检测用户使用哪个身份验证提供程序(id)进行身份验证。
这是我为此使用的一些代码:
val FirebaseUser.loginType: LoginType
get() {
if (isAnonymous) {
return LoginType.Anonymous
}
loop@ for (userInfo in providerData) {
when (userInfo.providerId) {
EmailAuthProvider.PROVIDER_ID -> return LoginType.Email
GoogleAuthProvider.PROVIDER_ID -> return LoginType.Google
FacebookAuthProvider.PROVIDER_ID -> return LoginType.Facebook
else -> continue@loop
}
}
return LoginType.Unknown
}
这不是我的问题,我的问题是:如何检测用户已经upgraded从匿名到例如Facebook?