为啥 Firebase pendingAuthResult 返回 null?

Posted

技术标签:

【中文标题】为啥 Firebase pendingAuthResult 返回 null?【英文标题】:Why does Firebase pendingAuthResult return null?为什么 Firebase pendingAuthResult 返回 null? 【发布时间】:2020-04-30 06:26:48 【问题描述】:

我正在尝试使用 Firebase 身份验证实现 Sign in with Apple。我正在关注firebase/quickstart-android 示例。

我的登录片段覆盖 onStart() 以检查任何待处理的结果:

override fun onStart() 
    super.onStart()

    val pending = auth.pendingAuthResult

    pending?.addOnSuccessListener  authResult ->
        Timber.d("Successful login, pending")
    ?.addOnFailureListener  e ->
        Timber.d("Failed login, pending")
    

还有一个启动登录流程的按钮:

btnApple.onClick 
    viewModel.appleLogin(requireActivity())

viewModel 从存储库中调用以下方法:

// Initiate sign-in flow only if there are no pending results
if (auth.pendingAuthResult != null) 
    return


val scopes = listOf("email", "name")
val provider = OAuthProvider.newBuilder("apple.com", auth)
    .setScopes(scopes)
    .build()

auth.startActivityForSignInWithProvider(activity, provider)
    .addOnSuccessListener  authResult ->
        Timber.d("Successful login, normal")
    
    .addOnFailureListener  e ->
        Timber.e(e, "Failed login, normal")
    

official manual 声明:

使用此方法登录会将您的 Activity 置于后台,这意味着它可以在登录流程中被系统回收。

所以我开始测试挂起的结果,方法是在 Android Studio 中终止应用,同时在 Chrome 中完成登录流程。返回应用程序后,onStart() 被调用,但 pendingAuthResult 始终为空。

为了更有趣,当我重新启动应用程序时,我已登录。然后如果我注销并再次输入登录片段,现在有一个待处理的结果,我收到Successful login, pending。最重要的是,待处理的结果不会消失。如果我离开登录片段并返回,待处理的结果仍然存在,我会收到另一个Successful login, pending

我什至测试了firebase/quickstart-android 样本本身,它也有完全相同的问题。

此问题的可能原因是什么?我正在使用firebase-auth:19.2.0

【问题讨论】:

这里有同样的问题。为了测试这一点,我正在使用开发人员功能“不要保留活动”。 【参考方案1】:

如果您使用 firebase 与 Apple 进行签名,并且如果它是手动处理的,那么您应该使用字符串解码机制,请查找相同的 firebase 指南并希望它能够正常工作。让我知道是否有任何问题!

Firebase guild signing with apple

【讨论】:

以上是关于为啥 Firebase pendingAuthResult 返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Firebase 报告错误的屏幕数据?

为啥我不能以这种方式将数据添加到 Firebase?

为啥 Firebase 功能部署非常缓慢?

为啥 Firebase pendingAuthResult 返回 null?

为啥注册用户后 Firebase 实时数据库用户 ID 与 Firebase 身份验证 UID 不匹配?

Firebase 推送通知 iOS:未注册。为啥?