You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Firebase集成Apple登录时邮箱返回null的原因排查

Apple登录后FirebaseUser邮箱为null的原因及解决办法

核心原因

你直接通过FirebaseUser?.email获取邮箱的方式有误——Apple OAuth返回的邮箱信息不会自动同步到FirebaseUser对象中,而是存储在AuthResult的additionalUserInfo.profile字段里。即便是首次授权,Firebase也不会自动将Apple提供的邮箱填充到FirebaseUser的email属性中。

解决步骤

  1. 从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方法,传递邮箱参数
    }
    
  2. 将邮箱同步到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)
        }
    }
    
  3. 调整数据收集方法
    修改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授权弹窗中用户已允许访问邮箱权限,即便你请求了email scope,用户仍可能在弹窗中拒绝授权,导致返回null。
  • 若用户启用了Apple的“隐藏我的邮箱”功能,返回的邮箱会是Apple提供的代理邮箱(格式类似xxx@privaterelay.appleid.com),而非用户真实邮箱,但不会出现null情况。

内容的提问来源于stack exchange,提问作者Iraklis Eleftheriadis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:23:12