每当我使用 Apple 登录时,我都会收到一封
null
电子邮件。请注意,显示名称不为空。另外,我已确保在尝试再次使用 Apple 登录之前撤销所有令牌,因为根据我的理解,Apple 在初次注册时仅提供一次电子邮件。这是我使用 Firebase 在 Android 中登录 Apple 的代码:
OAuth 提供商:
fun appleOAuthProvider(appLanguage: String): OAuthProvider {
return OAuthProvider
.newBuilder("apple.com")
.setScopes(listOf("name", "email"))
.addCustomParameter("locale", currentLanguageLocale(appLanguage))
.build()
} //: FUN
登录:
private fun singInUser(
auth: FirebaseAuth,
context: Context,
appLanguage: String,
isSigningIn: MutableState<Boolean>,
completion: (FirebaseUser?) -> Unit
) {
auth
.startActivityForSignInWithProvider(context.getActivity(), HelperFunctions.appleOAuthProvider(appLanguage))
.addOnSuccessListener { authResult ->
Log.d("SIGN IN WITH APPLE", "activitySignIn:onSuccess:${authResult.user}")
completion(authResult.user)
} //: ON SUCCESS
.addOnFailureListener { e ->
Log.w("SIGN IN WITH APPLE", "activitySignIn:onFailure", e)
isSigningIn.value = false
completion(null)
} //: ON FAILURE
} //: FUN
登录后,我使用之前获得的
authResult.user
收集用户数据:
private fun collectDataFromApple(
user: FirebaseUser?,
completion: (SignInResult) -> Unit
) {
val uid = user?.uid
val email = user?.email
var firstName = separatedFullName(user?.displayName)?.get(0)
var lastName = separatedFullName(user?.displayName)?.get(1)
if (firstName.isNullOrEmpty()) {
firstName = lastName
} else if (lastName.isNullOrEmpty()){
lastName = firstName
}
completion(
SignInResult(
data =
UserData(
personalInformation = UserData.PersonalInformation(
userID = uid,
email = email,
firstName = firstName,
lastName = lastName,
imageBitmap = null,
isNewUser = true,
isEmailVerified = mutableStateOf(true),
firebaseHasData = false
),
addressInformation = UserData.AddressInformation(),
contributeStatistics = UserData.ContributeStatistics()
),
errorMessage = null
)
)
} //: FUN
user?.email
由于未知原因返回 null。然而, firstName
和 lastName
不为空。这是为什么?
当您使用 Facebook 提供商对 Firebase 中的用户进行身份验证时,用户的电子邮件地址不会出现在 FirebaseUser 对象中。因此,要解决此问题,您必须读取提供程序列表并获取第二个提供程序,如以下代码行所示:
val auth = Firebase.auth
val email = auth.currentUser?.providerData?.get(1)?.email
你知道为什么我必须从列表中获取第二项而不是第一项吗?
FirebaseUser#getProviderData() 方法返回 UserInfo 类型的对象,其中:
表示用户的标准个人资料信息的集合。可用于公开身份提供商返回的个人资料信息,例如 Google 登录或 Facebook 登录。
通常,
providerData
列表中的第一个元素(索引 0)对应于用户的主要身份验证提供商,即 Google,第二个元素(索引 1)对应于辅助提供商,在本例中为 Apple ,在您的用例中。
如果您还希望电子邮件出现在 FirebaseUser 对象中,那么我建议您使用 FirebaseUser#updateEmail(email) 更新该对象。