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

React Native iOS模拟器首次认证后Firestore不可用问题求助

iOS模拟器首次Firebase认证后调用Firestore出现[firestore/unavailable]错误

问题描述

Firestore连接此前运行正常,近期在iOS模拟器上出现异常:用户通过邮箱/密码认证后首次查询Firestore文档时触发服务不可用错误,刷新应用后查询恢复正常;安卓模拟器无此问题。

错误信息:

Error: [firestore/unavailable] The service is currently unavailable. This is a most likely a transient condition and may be corrected by retrying with a backoff.

环境信息

package.json依赖版本:

"@react-native-firebase/analytics": "^15.3.0",
    "@react-native-firebase/app": "^15.3.0",
    "@react-native-firebase/auth": "^15.3.0",
    "@react-native-firebase/database": "^15.3.0",
    "@react-native-firebase/firestore": "^15.3.0",
    "@react-native-firebase/storage": "^15.3.0",
    "react-native": "0.64.0",

触发错误的代码片段

auth().onAuthStateChanged(async (authUser) => {
  console.log(authUser);
  if (authUser) {
    const banner = await firestore()
      .collection('banner')
      .doc(authUser.uid)
      .get();
  }
});

已排查的步骤

  • 确认authUser和Firestore实例正常输出,认证有效、实例存在
  • 清空iOS模拟器内容并重装开发版应用,无效
  • 尝试禁用/启用Token Service API,未解决
  • 未使用VPN,网络稳定
  • 临时设置Firestore规则为全读写,排除权限问题
  • 切换至历史正常版本代码,问题依然存在

解决方案建议

1. 添加指数退避重试机制

根据错误提示的「临时状态」特性,给首次查询添加重试逻辑:

const getBannerWithRetry = async (uid, retries = 3) => {
  try {
    return await firestore().collection('banner').doc(uid).get();
  } catch (error) {
    if (error.code === 'firestore/unavailable' && retries > 0) {
      // 指数退避等待:1s、2s、3s
      await new Promise(resolve => setTimeout(resolve, 1000 * (4 - retries)));
      return getBannerWithRetry(uid, retries - 1);
    }
    throw error;
  }
};

// 在onAuthStateChanged中替换原查询
auth().onAuthStateChanged(async (authUser) => {
  console.log(authUser);
  if (authUser) {
    try {
      const banner = await getBannerWithRetry(authUser.uid);
      // 处理查询结果
    } catch (err) {
      console.error('最终查询失败:', err);
    }
  }
});

2. 延迟Firestore查询

认证完成后短暂延迟再发起查询,避免认证状态同步延迟导致的连接问题:

auth().onAuthStateChanged(async (authUser) => {
  console.log(authUser);
  if (authUser) {
    // 延迟1秒执行查询
    await new Promise(resolve => setTimeout(resolve, 1000));
    const banner = await firestore()
      .collection('banner')
      .doc(authUser.uid)
      .get();
  }
});

3. 重置iOS模拟器网络设置

进入模拟器「设置」-「通用」-「传输或还原iPhone」-「还原」-「还原网络设置」,重启模拟器后重新测试。

4. 更新Firebase iOS SDK

检查Podfile.lock中Firebase相关SDK版本,执行pod update Firebase更新到最新稳定版,确保与react-native-firebase版本兼容。

5. 启用Firestore本地持久化

初始化时开启本地持久化,缓解首次连接的网络波动影响:

import firestore from '@react-native-firebase/firestore';

// 在应用初始化时调用
firestore().settings({
  persistence: true,
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:36:21