uni.onnetworkstatuschange能监听网络连通状态(isconnected)和类型(wifi/4g/5g),仅在app前台生效,不支持ssid、信号强度、bssid等细节;不适用于小程序,h5下始终返回unknown。

uni.onNetworkStatusChange 是唯一能实时监听网络切换的 API,但它只在 App 前台运行时有效,且不返回 WiFi 名称、信号强度等细节。
uni.onNetworkStatusChange 能监听什么、不能监听什么
它只响应系统网络栈的真实切换:比如 WiFi 断开→自动切到 5G,或 USB 网络共享启用。但注意以下边界情况:
-
isConnected为false不代表“物理断开”,可能是 WiFi 已连但 DHCP 没拿到 IP(常见于企业内网) -
isConnected为true也不代表“能上网”,只是系统认为链路通了(比如连上了一个没网的热点) - 它永远不提供
SSID、BSSID、信号强度,想校验是否连的是“office-2f”必须用uni.getConnectedWifi(需额外权限+平台兼容处理) - iOS 和 Android 行为基本一致,但微信小程序完全不支持该 API,H5 下始终返回
networkType: 'unknown'
为什么 onNetworkStatusChange 在后台收不到回调
这是系统级限制,不是 uni-app 的 bug。iOS 和 Android 都会暂停前台进程的网络事件监听以节省电量。实操中必须配合生命周期注册:
- 在
onShow中调用uni.onNetworkStatusChange,避免冷启动时监听未挂载 - 在
onHide中调用uni.offNetworkStatusChange,防止内存泄漏或重复绑定 - 真机调试时,iOS 必须开启「后台运行」权限(
UIBackgroundModes配置为audio或fetch),否则切到桌面后回调立刻停止
uni.getNetworkType 为什么不能代替实时监听
它是一次性快照,适合页面加载时兜底判断,但存在两个硬伤:
- 安卓部分机型冷启动时网络栈未就绪,
success回调里res.networkType可能是'unknown',不是失败,是“还没准备好” - iOS 在无网络时可能延迟返回(超 1s),直接写在
onLoad里会导致 UI 卡顿或白屏 - 它无法感知后续变化——用户连上 WiFi 后,页面状态不会自动更新,必须手动刷新或重查
- 推荐做法:用
uni.getNetworkType做初始状态,再立刻用uni.onNetworkStatusChange接管后续变化,两者互补
真正容易被忽略的是:网络状态变化 ≠ 业务可用。即使 isConnected: true 且 networkType: 'wifi',你也得自己发一个轻量 HTTP 请求(比如 GET /health)验证能否通内网服务——这才是考勤打卡、IoT 控制等场景的生死线。











