每当我登录苹果时,我都会收到一封null的邮箱.请注意,显示名称不为空.此外,在try 再次登录苹果之前,我已经确保取消所有令牌,因为据我所知,苹果只提供一次邮箱,在首次注册时.以下是我在装有Firebase的安卓系统中登录苹果的代码:

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返回空值.然而,firstNamelastName不是空的.为什么会这样呢?

推荐答案

当您使用Facebook提供程序在Firebase中对用户进行身份验证时,用户的邮箱地址不会出现在FirebaseUser对象中.因此,要解决这个问题,您必须读取提供程序列表并获取第二个提供程序,如以下代码行所示:

val auth = Firebase.auth
val email = auth.currentUser?.providerData?.get(1)?.email

你知道为什么我要买单子上的第二件而不是第一件吗?

FirebaseUser#getProviderData()方法返回一个UserInfo类型的对象,该对象:

表示用户的标准配置文件信息的集合.可用于显示身份Provider 返回的配置文件信息,例如Google登录或Facebook登录.

通常,providerData列表中的第一个元素(索引0)对应于用户的主要身份验证提供者Google,第二个元素(索引1)对应于辅助提供者,在本例中为Apple.

如果您想让邮箱也出现在FirebaseUser对象中,那么我建议您使用FirebaseUser#updateEmail(email)更新对象.

Android相关问答推荐

我到底应该如何分享我的应用程序中的图片?

为什么我在 android 中使用 TabLayout 时无法启动我的 Activity?

AndroidX Media3 迁移指南

将输出写入已发布的 Android 应用程序中的日志(log)文件?

Android - 如何使 TextInputEditText 的高度恰好为 2 行?

在 Android 房间迁移中获取上下文

Android 访问任意公共目录

Android Jetpack Compose 电视焦点恢复

在 compose 中做可变状态堆栈

Jetpack Compose 如何使一个项目相对于另一个项目垂直居中

以下代码如何在 Android 上运行

Jetpack Compose UI - 在 AlertDialog 中单击时按钮宽度会发生变化

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

是否可以在 Kotlin 中为 mutableStateOf() 设置自定义设置器

Compose Accompaniist Pager 中的 TabRow/Tab 重组问题

在 Google Play 中将用户从开放测试转移到生产的过程是怎样的?

前台服务通知需要几秒钟才能显示

如何在 Jetpack Compose 中为中心对齐设置动画?

重命名列失败的房间自动迁移(NOT NULL 约束失败,生成错误的迁移类)

如何在 Kotlin 中使用反向绑定适配器将小写文本转换为大写?