Android 可获取 WiFi 名称但需三重校验:声明并动态申请定位权限、清洗双引号、验证 IP 是否有效;iOS 因系统封禁完全不可行;小程序端应使用 wx.getConnectedWifi 且需用户授权定位。

在 uni-app 中获取当前连接的 WiFi 名称(即 SSID),**Android 可行但限制多,iOS 基本不可行**。这不是 API 写得不对,而是系统层直接封禁——尤其 iOS 从 iOS 12 起就禁止 App 读取 SSID,连原生插件都绕不过去。
Android 上用 plus.android 获取 SSID 的真实流程
不能只调 wifiManager.getConnectionInfo().getSSID() 就完事。实际要过三关:权限、WiFi 状态、返回值清洗。
- manifest.json 必须声明三个权限:
android.permission.ACCESS_WIFI_STATE、android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_COARSE_LOCATION(后者在部分国产 ROM 上是硬性要求) - 运行时必须主动请求
ACCESS_FINE_LOCATION,否则getSSID()返回"或空字符串" -
getSSID()返回的字符串带英文双引号,比如"MyHomeWiFi",必须用.replace(/"/g, "")清洗 - 即使拿到非空字符串,也要校验 IP 地址是否有效:若
wifiInfo.getIpAddress()是 0,说明其实没真正连上,只是“显示已连接”
为什么 getNetworkType === 'wifi' 不等于真连上了
uni.getNetworkType 只查网络栈类型,不验证物理层连接状态。常见误判场景:
- 手机开了 WiFi 但未关联任何 AP(如刚打开 WiFi 设置页)→ 返回
wifi,但getConnectionInfo()拿不到有效 SSID - 连上了热点但 DHCP 失败,IP 是 0.0.0.0 →
getSSID()有值,但实际无法上网 - 某些华为/小米机型在省电模式下会强制断开 WiFi 关联,
getNetworkType仍报wifi
iOS 上根本拿不到 SSID,别白费劲
苹果明确禁止第三方 App 访问当前 WiFi 名称。所有尝试——包括调用 CNCopyCurrentNetworkInfo、自建原生模块、甚至用私有 API —— 在 App Store 审核阶段都会被拒。iOS 14+ 还会弹系统级提示:“此 App 尝试访问 WiFi 信息”,用户点“不允许”后连错误回调都不触发。
如果你看到某篇教程说“iOS 可以通过 xxx 插件拿到 SSID”,基本是以下情况之一:本地调试用企业签名绕过限制、模拟器返回假数据、或代码根本没跑通。
小程序平台(微信/支付宝)走 wx.getConnectedWifi
这个 API 是唯一跨端相对可靠的方案,但它只在小程序环境生效,且有硬性前提:
- 必须是真机调试或正式发布的小程序(开发者工具里返回 mock 数据)
- 用户需开启定位服务(微信要求“使用中持续获取”权限)
- 返回的
ssid字段在 Android 和 iOS 上都存在,但 iOS 下可能为空字符串(取决于系统版本和用户授权粒度) - 注意它和
uni.getConnectedWifi不是同一个东西:uni.开头的是 uni-app 自己封装的,仅支持 App 端;wx.开头的是微信小程序原生 API,仅限微信小程序
最常被忽略的一点:Android 上的 SSID 获取失败,90% 是因为漏了 ACCESS_FINE_LOCATION 运行时授权,而不是 manifest 权限没配——后者只管打包,前者才决定运行时能不能读到真实值。











