Android 可通过 uni.getConnectedWifi() 获取真实 SSID,但需声明三项权限、动态申请定位权限、清洗双引号;iOS 自 iOS 12 起系统级屏蔽,SSID 恒为空或占位符,无合规获取路径。
android 上能拿到真实 ssid,但必须过三关:权限声明、运行时动态申请、字符串清洗;ios 上基本拿不到,不是代码问题,是系统封禁。
uni.getConnectedWifi() 在 App 端是否可用
这个 API 在 App 端(Android/iOS)确实存在,但行为差异极大:
- Android:只要权限和状态到位,
uni.getConnectedWifi()通常能返回wifi.SSID,值为带英文双引号的字符串(如"MyHome"),需手动清洗 - iOS:从 iOS 12 起系统级屏蔽,即使调用成功,
wifi.SSID也大概率是空字符串、"Wi-Fi"或占位符;App Store 审核会直接拒绝任何尝试读取真实 SSID 的逻辑 - 注意:
uni.getConnectedWifi()不触发扫描,只读当前已连接网络;它不等价于uni.getNetworkType() === 'wifi',后者可能返回wifi但实际未关联 AP 或 IP 为 0
Android 必须做的三件事
缺一不可,否则拿到的 SSID 是 "、空、或带双引号无法显示:
- 在
manifest.json的app-plus.distribute.android.permissions中声明三项权限:"android.permission.ACCESS_WIFI_STATE"、"android.permission.ACCESS_FINE_LOCATION"、"android.permission.ACCESS_COARSE_LOCATION" - 首次启动时主动调用
plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'], ...),用户拒绝后后续所有获取静默失败 - 对返回的
res.wifi.SSID做清洗:ssid.replace(/^"+|"+$/g, ''),否则前端显示会多出引号 - 额外建议:校验
wifiInfo.getIpAddress() !== 0,避免“显示已连但无 IP”的假连接
为什么不能只靠 plus.android 调原生
即使你绕过 uni.getConnectedWifi(),直接用 Native.js 调 WifiManager.getConnectionInfo().getSSID(),依然逃不开系统限制:
- Android 6.0+ 后,
getSSID()行为绑定位置权限 —— 没申请ACCESS_FINE_LOCATION,就返回"" - 部分国产 ROM(如华为 EMUI、小米 MIUI)还要求同时申请
ACCESS_COARSE_LOCATION,否则照样失败 - iOS 上,
CNCopyCurrentNetworkInfo在 iOS 14+ 默认返回空字典,且调用时系统会弹窗提示“此 App 尝试访问 WiFi 信息”,用户点“不允许”后连 error 回调都不触发
真正容易被忽略的是:iOS 上没有任何合规路径能拿到当前 WiFi 名称。别在真机上反复测试“为什么没返回”,那是系统设计如此;Android 上则务必把权限申请和字符串清洗写进主流程,而不是只放在 success 回调里做 console.log。











