getWifiList返回空因未走完完整流程:需先startWifi初始化,再注册onGetWifiList监听回调,且真机必须开启定位权限并配置requiredPrivateInfos白名单。

uni-app里getWifiList为什么总返回空?
因为没走完完整流程:微信小程序的WiFi API是事件驱动的,getWifiList本身不返回数据,只触发系统扫描;真实列表必须靠onGetWifiList监听回调才能拿到。很多人写了getWifiList就以为完事了,结果console.log出来是undefined或空数组。
- 必须先调用
startWifi初始化模块,否则后续全部失败
-
getWifiList成功后,要提前注册onGetWifiList,否则回调收不到
- 真机调试时,若未开启定位服务或拒绝
scope.userLocation授权,列表一定为空(Android/iOS均如此)
- 微信开发者工具模拟器不支持WiFi扫描,必须真机测试
startWifi初始化模块,否则后续全部失败 getWifiList成功后,要提前注册onGetWifiList,否则回调收不到 scope.userLocation授权,列表一定为空(Android/iOS均如此) 示例片段(不可省略任一环节):
uni.startWifi({ success: () => { uni.onGetWifiList(res => { console.log('扫到这些WiFi:', res.wifiList) }) uni.getWifiList({ fail: err => console.error('扫描触发失败', err) }) }, fail: err => console.error('WiFi模块启动失败', err) })Android真机上getWifiList返回空,但权限都配了?
大概率是缺了运行时定位权限。从Android 6.0起,ACCESS_FINE_LOCATION属于危险权限,光在manifest.json里声明不够,还必须在代码里动态申请。
-
manifest.json中app-plus → distribute → android → permissions需包含:android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_WIFI_STATE
- 必须在调用
startWifi前,执行uni.authorize({ scope: 'scope.userLocation' })
- 若用户之前点过“拒绝”,
authorize会直接失败,得引导跳转系统设置页:uni.openSystemSetting()
- Android 10+强制要求定位权限,哪怕你只扫列表、不连接,也绕不开
微信小程序配置requiredPrivateInfos报错或不生效?
这是微信平台的硬性白名单机制,不是可选项。如果你没在mp-weixin节点下显式声明,API调用会被静默拦截,控制台可能连错误都不抛。
- 必须在
manifest.json的mp-weixin对象里加:"requiredPrivateInfos": ["getWifiList", "startWifi"]
- 同时补全
permission字段:"scope.userLocation": { "desc": "用于获取附近WiFi列表" }
- 注意:这个
desc文案会在首次授权弹窗中显示,不能为空或纯空格,否则审核可能被拒
- 修改后必须重新上传小程序代码,本地调试不会校验该字段
App端(iOS/Android)能用uni.getWifiList吗?
不能。UniApp的getWifiList等API仅在微信/支付宝等小程序平台可用,App端(app-plus)完全不支持——官方文档明确标注为“小程序专属”。
- 想在App里实现,唯一可行路径是写原生插件:Android用
WifiManager,iOS用CNCopyCurrentNetworkInfo(iOS 12+)或NEHotspotNetwork(iOS 14+)
- 插件需处理权限桥接、异步回调封装、密码加密传输等细节,开发成本远高于小程序
- 第三方插件如
Fvv-UniWifiHelper可降低门槛,但仍需手动配置权限和链接原生模块
manifest.json中app-plus → distribute → android → permissions需包含:android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_WIFI_STATE startWifi前,执行uni.authorize({ scope: 'scope.userLocation' }) authorize会直接失败,得引导跳转系统设置页:uni.openSystemSetting() requiredPrivateInfos报错或不生效?
这是微信平台的硬性白名单机制,不是可选项。如果你没在mp-weixin节点下显式声明,API调用会被静默拦截,控制台可能连错误都不抛。
- 必须在
manifest.json的mp-weixin对象里加:"requiredPrivateInfos": ["getWifiList", "startWifi"] - 同时补全
permission字段:"scope.userLocation": { "desc": "用于获取附近WiFi列表" } - 注意:这个
desc文案会在首次授权弹窗中显示,不能为空或纯空格,否则审核可能被拒 - 修改后必须重新上传小程序代码,本地调试不会校验该字段
App端(iOS/Android)能用uni.getWifiList吗?
不能。UniApp的getWifiList等API仅在微信/支付宝等小程序平台可用,App端(app-plus)完全不支持——官方文档明确标注为“小程序专属”。
- 想在App里实现,唯一可行路径是写原生插件:Android用
WifiManager,iOS用CNCopyCurrentNetworkInfo(iOS 12+)或NEHotspotNetwork(iOS 14+)
- 插件需处理权限桥接、异步回调封装、密码加密传输等细节,开发成本远高于小程序
- 第三方插件如
Fvv-UniWifiHelper可降低门槛,但仍需手动配置权限和链接原生模块
WifiManager,iOS用CNCopyCurrentNetworkInfo(iOS 12+)或NEHotspotNetwork(iOS 14+) Fvv-UniWifiHelper可降低门槛,但仍需手动配置权限和链接原生模块 最常被忽略的一点:WiFi扫描不是纯前端能力,它卡在系统层、权限层、平台策略层三层交界处。写对三行API只是开始,真正耗时的是把每层的“必须动作”都补全——尤其是Android的动态定位授权和微信的requiredPrivateInfos白名单。

















