Android中Firebase集成Apple登录时邮箱返回null的原因排查
Apple登录后FirebaseUser邮箱为null的原因及解决办法
核心原因
你直接通过FirebaseUser?.email获取邮箱的方式有误——Apple OAuth返回的邮箱信息不会自动同步到FirebaseUser对象中,而是存储在AuthResult的additionalUserInfo.profile字段里。即便是首次授权,Firebase也不会自动将Apple提供的邮箱填充到FirebaseUser的email属性中。
解决步骤
从AuthResult中提取邮箱
在登录成功的回调里,优先从authResult.additionalUserInfo?.profile获取邮箱,而非直接调用authResult.user?.email:.addOnSuccessListener { authResult -> val appleEmail = authResult.additionalUserInfo?.profile?.get("email") as? String val user = authResult.user Log.d("SIGN IN WITH APPLE", "activitySignIn:onSuccess:${user}, email:${appleEmail}") completion(user, appleEmail) // 修改completion方法,传递邮箱参数 }将邮箱同步到FirebaseUser
拿到邮箱后,手动更新FirebaseUser的邮箱属性,确保后续可通过user?.email正常获取:user?.updateEmail(appleEmail ?: "")?.addOnCompleteListener { updateTask -> if (updateTask.isSuccessful) { Log.d("SIGN IN WITH APPLE", "用户邮箱更新成功") } else { Log.w("SIGN IN WITH APPLE", "用户邮箱更新失败", updateTask.exception) } }调整数据收集方法
修改collectDataFromApple的参数,传入从AuthResult中拿到的邮箱,替代原有的user?.email:private fun collectDataFromApple( user: FirebaseUser?, appleEmail: String?, completion: (SignInResult) -> Unit ) { val uid = user?.uid val email = appleEmail // 使用从Apple OAuth获取的邮箱 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 ) ) }
额外注意点
- 确认Apple授权弹窗中用户已允许访问邮箱权限,即便你请求了
emailscope,用户仍可能在弹窗中拒绝授权,导致返回null。 - 若用户启用了Apple的“隐藏我的邮箱”功能,返回的邮箱会是Apple提供的代理邮箱(格式类似
xxx@privaterelay.appleid.com),而非用户真实邮箱,但不会出现null情况。
内容的提问来源于stack exchange,提问作者Iraklis Eleftheriadis
相关产品推荐
相关产品推荐

