关闭网络时Firestore报Stream closed UNAVAILABLE警告是否正常及如何避免
警告性质判定
你在断网场景下看到的Firestore相关警告属于正常预期现象,不属于业务异常错误。
该警告的触发原因是Firestore SDK默认会维持和云端的长连接用于数据同步,当网络主动断开时,底层gRPC通道、SSL连接无法正常传输数据、域名解析失败,都会抛出对应级别的警告日志,Firestore本身自带重试和离线缓存机制,该警告不会导致应用崩溃,也不会影响离线功能的正常运行。
你遇到的警告日志如下:
W/Firestore( 8864): (23.0.1) [WatchStream]: (c9d068c) Stream closed with status: Status{code=UNAVAILABLE, description=End of stream or IOException, cause=null}. V/NativeCrypto( 8864): Write error: ssl=0xb40000726aa4a958: I/O error during system call, Broken pipe V/NativeCrypto( 8864): SSL shutdown failed: ssl=0xb40000726aa4a958: I/O error during system call, Success W/ManagedChannelImpl( 8864): [{0}] Failed to resolve name. status={1} W/Firestore( 8864): (23.0.1) [WatchStream]: (c9d068c) Stream closed with status: Status{code=UNAVAILABLE, description=null, cause=java.net.ConnectException: failed to connect to firestore.googleapis.com/142.251.37.202 (port 443) from /:: (port 0): connect failed: ENETUNREACH (Network is unreachable) W/Firestore( 8864): at libcore.io.IoBridge.connect(IoBridge.java:142) W/Firestore( 8864): at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142) W/Firestore( 8864): at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390) W/Firestore( 8864): at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) W/Firestore( 8864): at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) W/Firestore( 8864): at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) W/Firestore( 8864): at java.net.Socket.connect(Socket.java:621) W/Firestore( 8864): at java.net.Socket.connect(Socket.java:570) W/Firestore( 8864): at java.net.Socket.<init>(Socket.java:450) W/Firestore( 8864): at java.net.Socket.<init>(Socket.java:250) W/Firestore( 8864): at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:285) W/Firestore( 8864): at io.grpc.okhttp.OkHttpClientTransport$4.run(OkHttpClientTransport.java:555) W/Firestore( 8864): at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) W/Firestore( 8864): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) W/Firestore( 8864): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) W/Firestore( 8864): at java.lang.Thread.run(Thread.java:923) W/Firestore( 8864): Caused by: android.system.ErrnoException: connect failed: ENETUNREACH (Network is unreachable) W/Firestore( 8864): at libcore.io.Linux.connect(Native Method) W/Firestore( 8864): at libcore.io.ForwardingOs.connect(ForwardingOs.java:94) W/Firestore( 8864): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:138) W/Firestore( 8864): at libcore.io.ForwardingOs.connect(ForwardingOs.java:94) W/Firestore( 8864): at libcore.io.IoBridge.connectErrno(IoBridge.java:156) W/Firestore( 8864): at libcore.io.IoBridge.connect(IoBridge.java:134) W/Firestore( 8864): ... 15 more W/Firestore( 8864): }.
警告规避方案
- 关闭Firestore调试日志:在应用初始化阶段直接关闭Firestore的日志输出,即可过滤掉该类警告,仅关闭调试日志不会影响业务报错的捕获,Android平台示例代码如下:
// Java写法 FirebaseFirestore.setLoggingEnabled(false);
// Kotlin写法 FirebaseFirestore.getInstance().setLoggingEnabled(false)
- 结合网络状态动态管理实时监听:监听设备网络连接状态,当检测到网络断开时,手动注销当前活跃的Firestore实时快照监听器,网络恢复后再重新注册,避免SDK持续尝试连接云端触发重复警告。
- 确认离线持久化已开启:Firestore默认开启离线持久化功能,该功能开启后,离线状态下的所有数据操作会先缓存到本地,不会高频发起网络连接请求,仅会在断网瞬间输出一次连接警告,不会重复弹窗或输出冗余日志。
如果应用本身支持离线使用,无需做任何额外处理也不会影响用户体验,该警告仅会在开发调试的控制台输出,普通用户无法感知。
内容的提问来源于stack exchange,提问作者Mahmoud Niypoo
相关产品推荐
相关产品推荐

