React Native iOS模拟器首次认证后Firestore不可用问题求助
问题描述
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
相关产品推荐
相关产品推荐

