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

断网重连时Firebase Auth的Facebook、Google登录回调不触发问题

问题原因
  • Firebase Auth SDK 默认离线重试策略缺陷:旧版本 Firebase Auth 对signInWithCredential类请求采用指数退避重试机制,断网时发起的请求失败后,重试间隔会持续拉长,最长重试间隔可达4小时,完全匹配你遇到的延迟触发场景。即使后续网络恢复,SDK也会按之前计算的退避时间等待后才发起重试,不会立即触发回调。
  • 回调上下文绑定失效:你的代码中使用addOnCompleteListener(this)绑定了Activity/Fragment上下文,如果发起请求后页面发生销毁重建,原有回调会被解绑,即便后续请求重试成功也无法触发回调,会被误认为是请求未响应。
  • 第三方凭证过期校验延迟:如果断网时传入的Facebook/Google AccessToken已经过期,SDK重试时会先静默尝试刷新第三方凭证,这个过程会进一步拉长回调触发时间,甚至会陷入刷新失败的重试循环。
可行解决方案
  • 发起请求前先做网络状态校验,断网场景直接拦截请求,避免无效请求进入SDK的重试队列
// 先判断网络连通性,无网络直接提示用户
if (!isNetworkAvailable()) {
    Toast.makeText(baseContext, "当前无网络,请联网后重试", Toast.LENGTH_SHORT).show()
    return
}
val mCredential = FacebookAuthProvider.getCredential(mAccesstoken!!.token)
// 原有登录逻辑
  • 调整回调绑定方式,改用无页面上下文绑定的监听器,避免页面销毁导致回调丢失
mFirebaseAuth.signInWithCredential(mCredential)
    .addOnSuccessListener { authResult ->
        Log.d(TAG, "signInWithCredential:success")
        getCurrentUser(authResult.user)
    }
    .addOnFailureListener { exception ->
        Log.w(TAG, "signInWithCredential:failure", exception)
        Toast.makeText(baseContext, "Authentication failed.", Toast.LENGTH_SHORT).show()
    }
  • 升级Firebase Auth SDK到21.1.0及以上版本,该版本修复了离线重试退避时间异常拉长的已知问题,默认最大重试间隔被调整到1分钟以内。
  • 给登录请求增加超时逻辑,超过指定时间未响应主动取消任务,避免长时间等待
val signInTask = mFirebaseAuth.signInWithCredential(mCredential)
// 15秒超时机制
Handler(Looper.getMainLooper()).postDelayed({
    if (!signInTask.isComplete) {
        signInTask.cancel()
        Toast.makeText(baseContext, "登录超时,请重试", Toast.LENGTH_SHORT).show()
    }
}, 15000)
  • 每次发起登录前先校验Facebook/Google返回的AccessToken有效期,确认凭证未过期再传给Firebase,避免无效请求进入重试队列。

内容的提问来源于stack exchange,提问作者pragneshReddy Nandyala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:54:02