uni.getNetworkType在各平台返回值不一致:Android/iOS App支持wifi/4g/5g/none;微信小程序稳定但无2g/3g;H5恒为unknown;支付宝/头条小程序可能success返回unknown;需组合uni.getConnectedWifi、局域网探测等多策略判断真实WiFi状态。

uni-app 里能直接拿到当前联网类型,但“能拿到”和“拿得准”是两回事。不同平台返回值不一致、H5 环境永远返回 unknown、小程序里没权限时可能卡住回调——这些坑不提前踩一遍,真机一跑就掉链子。
uni.getNetworkType 返回值在各平台到底怎么变?
这个 API 看似简单,实际是跨平台最不稳定的网络判断入口。它不是实时监听,只是一次性快照,而且各端行为差异明显:
- Android App:正常返回
wifi、4g、5g、none等;但若未申请ACCESS_NETWORK_STATE权限,可能静默失败或返回unknown - iOS App:需确保
Info.plist中配置了网络权限描述(NSAppTransportSecurity允许 HTTP 请求非必须,但网络状态本身不依赖它) - 微信小程序:稳定支持
wifi/4g/5g/none,但注意2g/3g在新机型上基本不会出现,实际只会见到4g或5g - H5:无论连没连 WiFi,一律返回
unknown,这是浏览器安全策略限制,无法绕过 - 支付宝/头条小程序:部分支持
onNetworkStatusChange,但getNetworkType可能不触发fail,而是直接走success返回unknown
如何写一个真正可用的“是否连着 WiFi”判断逻辑?
光靠 uni.getNetworkType 的 networkType === 'wifi' 是不够的。真实场景下,你要防的是“明明连着 WiFi 却返回 4g”或“返回 wifi 但其实只是开了热点没上网”。建议组合判断:
- 先调用
uni.getNetworkType,如果返回wifi,再补一次uni.getConnectedWifi(仅 App 端可用)确认 SSID 是否非空 - 如果返回
4g或5g,但你又知道用户大概率在办公室,可以加一层本地局域网探测(比如发个请求到内网地址http://192.168.1.1:8080/ping,超时即判定不在目标 WiFi) - 避免在
onLoad里单次调用就做关键决策,应配合uni.onNetworkStatusChange监听变化,且首次调用后延时 300ms 再读取,防止系统状态未刷新 - 对 H5 用户明确降级:显示“网页环境无法识别 WiFi,请切换至 App 使用完整功能”
uni.onNetworkStatusChange 监听失效的常见原因
这个监听器在某些条件下会完全不触发,不是代码写错了,而是环境或配置没到位:
- Android 打包时未在
manifest.json的android.permissions里声明ACCESS_NETWORK_STATE,监听器注册成功但永远不回调 - iOS 上未在
manifest.json → ios → privacyDescription中添加NSLocationWhenInUseUsageDescription,部分旧版系统会静默禁用网络状态服务 - 微信小程序基础库版本低于 2.10.4,
onNetworkStatusChange不支持networkType字段,只能拿到isConnected - 监听器必须在应用生命周期早期注册(比如
App.vue的onLaunch),放在某个页面的onLoad里,切页后容易丢失上下文 - 某些 Android 定制 ROM(如 MIUI、EMUI)会限制后台网络状态轮询,导致监听延迟高达 10 秒以上
为什么不能只靠 networkType 判断“是否在公司 WiFi”?
因为 networkType === 'wifi' 只说明连着某个 WiFi,不代表连的是你期望的那个。要精准识别办公网络,必须拿到 SSID:
-
uni.getConnectedWifi是官方 API,仅 App 端可用,返回包含ssid、bssid、ipAddress的对象,但需要额外权限:Android 要ACCESS_WIFI_STATE+ACCESS_FINE_LOCATION(iOS 同样要位置权限) - 微信小程序完全不提供获取 SSID 的能力,这是平台强制限制,任何插件或 hack 都无效
- 如果你的应用必须区分多个 WiFi(比如“Office-2.4G” vs “Office-5G”),只比对
ssid不够,还得校验bssid,因为 SSID 可被伪造,BSSID 是路由器 MAC 地址哈希,更可靠 - 注意:Android 10+ 默认禁止后台获取 WiFi 信息,必须确保 App 处于前台,且用户已授予权限,否则
getConnectedWifi会直接 fail
最麻烦的点不是 API 调不通,而是不同平台对“WiFi”的定义不一致:iOS 认为开启个人热点就算 wifi 类型,Android 可能归为 ethernet 或 unknown;而用户根本不知道自己连的是哪个频段、哪个 AP。所以别把“检测 WiFi”当成一个布尔值问题,它本质是一个多层验证的上下文判断。


















