uni.onNetworkStatusChange能监听网络连通性变化和类型切换,但不能判断WiFi是否真正能上网、获取SSID或信号强度;仅前台生效,需配合onShow注册、定位权限授权及健康接口二次校验。

uni.onNetworkStatusChange 能监听网络连通性变化和类型切换,但不能判断 WiFi 是否真正能上网,也不能获取 SSID 或信号强度;它只在应用前台时有效,后台不触发。
uni.onNetworkStatusChange 的实际行为边界
这个 API 不是“只要网络一动就立刻回调”,它有明确的平台限制:
- iOS 上仅在应用处于前台且网络状态发生实质性变化(如从 wifi 切到 4g、从有网变无网)时才触发;切到后台后完全停止监听
- Android 各厂商差异大,部分机型(尤其华为、小米)会因省电策略延迟或丢弃回调,甚至需要开启“自启动”“电池优化白名单”才能稳定工作
- 返回的
res.isConnected是系统级连通判断,不代表能访问外网——比如连上了没配 DNS 的 WiFi,isConnected仍为true,但实际打不开网页 -
res.networkType只返回wifi/4g/5g/none等粗粒度值,不会告诉你连的是 “CMCC-5G” 还是 “TP-LINK_XXXX”
如何避免监听失效:生命周期 + 权限 + 降级兜底
单纯调用 uni.onNetworkStatusChange 很容易在真机上“静默失败”。必须配合三件事:
- 在
onShow钩子中重新注册监听(App 切回前台时可能已丢失回调句柄) - 提前检查并引导用户授权定位权限——Android 10+ 和 iOS 均要求开启定位权限才能获取准确网络类型,否则
networkType恒为unknown或none - 对关键操作(如上传、同步)做二次校验:不要只信
isConnected === true,加一个uni.requestping 自己的健康接口,超时即判定为“假连网”
uni.getNetworkType 和 uni.onNetworkStatusChange 怎么配合用
它们不是替代关系,而是互补:
-
uni.getNetworkType是快照,适合页面初始化时做一次判断(比如首页加载前先看是不是 WiFi,决定是否预加载高清资源) -
uni.onNetworkStatusChange是流式通知,适合全局维护一个网络状态变量(如store.state.network.status),并在状态变更时刷新 UI 提示(如顶部红条“网络已断开”) - 别在
onNetworkStatusChange回调里直接发起复杂请求——回调本身不保证执行上下文,推荐只做状态更新,再由 watcher 或 computed 触发业务逻辑 - 记得在页面
onHide或组件beforeUnmount中调用uni.offNetworkStatusChange,否则可能造成内存泄漏或重复触发
最常被忽略的一点:iOS 真机下,如果项目 manifest.json 里没填 NSLocationWhenInUseUsageDescription,或者用户手动关闭了定位权限,uni.onNetworkStatusChange 的 networkType 就永远拿不到 wifi ——你看到的全是 unknown,但控制台又不报错,排查起来非常隐蔽。











