一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

uni-app如何获取手机端当前联网类型 uni-app检测2G/3G/4G/5G/WiFi状态【实战】

时间:2026-07-29 12:47:59 编辑:袖梨 来源:一聚教程网

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:正常返回 wifi4g5gnone 等;但如果没有申请 ACCESS_NETWORK_STATE 权限,可能返回 unknown
  • iOS App:需确保 Info.plist 中已经配置网络权限说明(NSAppTransportSecurity 网络状态与是否允许非必须的 HTTP 请求无关)
  • 微信小程序:能够稳定支持 wifi/4g/5g/none,但要留意 2g/3g 在新机型中基本不会返回,实际通常只能看到 4g5g
  • H5:不论是否连接 WiFi,都会返回 unknown,这是浏览器安全策略造成的限制,无法规避
  • 支付宝/头条小程序:仅部分支持 onNetworkStatusChange,但 getNetworkType 可能不会触发 fail,而会直接进入 success 返回 unknown

“是否连着 WiFi”的判断逻辑怎样才真正可用?

仅依靠 uni.getNetworkTypenetworkType === 'wifi' 并不足以应对真实场景。真正需要防范的是“已经连接 WiFi 却返回 4g”或者“返回 wifi 却没有网络,实际只是热点已开启”。应当结合以下条件判断:

  • 首先调用 uni.getNetworkType,如果得到 wifi,则再补充调用一次 uni.getConnectedWifi确认 SSID 非空,此项只适用于 App 端
  • 如果得到 4g5g,但已知用户大概率身处办公室,还可以增加本地局域网探测(例如向内网地址发送请求 http://192.168.1.1:8080/ping,若超时则判定未连接目标 WiFi)
  • 不要在 onLoad 中仅调用一次便进行关键决策,应当配合 uni.onNetworkStatusChange 首次调用结束后,先等待 300ms 再读取并监听变化,以免系统状态来不及刷新
  • 明确为 H5 用户降级,显示“网页环境无法识别 WiFi,请切换至 App 使用完整功能”

导致uni.onNetworkStatusChange无法监听变化的常见因素

特定条件下,这个监听器可能完全不会触发。原因并非代码有误,而是环境或配置没有准备妥当:

  • Android 打包时没有在 manifest.jsonandroid.permissions 中声明 ACCESS_NETWORK_STATE,即使监听器注册成功,也始终不会回调
  • iOS 上没有在 manifest.json → ios → privacyDescription 中加入 NSLocationWhenInUseUsageDescription,部分旧版系统将静默关闭网络状态服务
  • 基础库版本尚未达到 2.10.4 的微信小程序,onNetworkStatusChange 不支持 networkType 字段,只能取得 isConnected
  • 监听器需要在应用生命周期的早期注册(例如 App.vueonLaunch),若放在某个页面的 onLoad 中,页面切换后很容易失去上下文
  • 后台网络状态轮询可能被 MIUI、EMUI 等某些 Android 定制 ROM 限制,监听因而会延迟 10 秒以上

为什么判断“是否在公司 WiFi”不能只依据 networkType?

因为 networkType === 'wifi' 只能表明设备连接了某个 WiFi,却不能证明它就是目标网络。若要准确识别办公网络,必须取得 SSID:

  • uni.getConnectedWifi 返回内容包含在对象中,这是仅能用于 App 端的官方 API ssidbssidipAddress 的对象,额外权限不可缺少:对 Android 而言要 ACCESS_WIFI_STATE + ACCESS_FINE_LOCATION(iOS 同样需要位置权限)
  • 获取 SSID 的能力在微信小程序中完全不开放,这是平台的强制限制,任何插件或 hack 均无法突破
  • 只比对并不足以满足应用区分多个 WiFi 的需求(比如“Office-2.4G” vs “Office-5G”),如果必须区分 ssid 还不够,还需要校验 bssid,更可靠的是作为路由器 MAC 地址哈希的 BSSID,因为 SSID 能被伪造
  • 注意:只有 App 位于前台且用户已授予权限,才能在 Android 10+ 获取 WiFi 信息;系统默认禁止后台获取,否则 getConnectedWifi 会立即 fail

真正棘手的不是 API 无法调用,而是各平台对“WiFi”的定义不同:iOS 会将开启个人热点视为 wifi 类型,Android 则可能归入 ethernetunknown;用户也根本不清楚自己连接的是哪个频段或哪个 AP。因此,“检测 WiFi”不能被视为简单的布尔值问题,其本质是结合上下文进行多层验证。

热门栏目