android 可通过 uni.getconnectedwifi() 获取真实 wifi 名称,但需同时满足权限声明、动态申请定位权限、清洗双引号三条件;ios 自 ios 12 起系统级屏蔽,无任何合规路径获取真实 ssid。

Android 上能拿到,但必须过三关:权限声明、动态申请定位、清洗双引号;iOS 上拿不到真实 SSID,不是代码问题,是系统封禁。
uni.getConnectedWifi() 在 Android 上为什么返回 "" 或空字符串
这不是 API 调用失败,而是缺了关键前置条件。Android 从 6.0 开始,读取已连接 WiFi 的 SSID 实际依赖位置权限,仅声明 ACCESS_WIFI_STATE 不够。
- manifest.json 的
app-plus.distribute.android.permissions中必须包含三项:android.permission.ACCESS_WIFI_STATE、android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_COARSE_LOCATION(部分华为/小米 ROM 强制要求后者) - 首次启动时必须主动调用
plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'], ...),用户点“拒绝”后,后续所有uni.getConnectedWifi()都静默失败,不会进 fail 回调 - 即使成功返回,
res.wifi.SSID是带英文双引号的字符串(如"MyOffice"),不清洗就直接渲染,前端会显示多余引号
拿到 SSID 后为什么还要校验 IP 地址
uni.getNetworkType() === 'wifi' 只表示网络栈类型是 WiFi,不代表真连上了 AP 或有有效 IP。很多机型在省电模式、DHCP 失败、或刚打开 WiFi 设置页时,会返回假连接状态。
- 务必检查
wifiInfo.getIpAddress() !== 0(Android 原生)或res.wifi.ipAddress && res.wifi.ipAddress !== '0.0.0.0'(uni-app 返回结构) - 如果 IP 为 0 或
undefined,说明设备虽显示“已连接”,实际未获取到地址,此时SSID不可信,不应用于配网、打卡等关键逻辑
iOS 上为什么无论如何都拿不到真实 SSID
这不是 uni-app 的限制,也不是你漏写了配置,而是苹果自 iOS 12 起系统级屏蔽,且审核政策明确禁止。
- iOS 14+ 调用
CNCopyCurrentNetworkInfo默认返回空字典;即使你绕过 uni-app 直接写原生模块,也会被拦截 - App Store 审核指南 5.1.1 明确要求:“App 不得读取当前 Wi-Fi 网络名称,除非该功能是核心业务且已在 App Store Connect 中声明并获批准”(例如家庭中枢配网)
- 用户首次调用时,系统会弹窗提示“此 App 尝试访问 WiFi 信息”,点“不允许”后,
uni.getConnectedWifi()既不进 success 也不进 fail,直接静默返回{ wifi: { SSID: '', BSSID: '', signalStrength: 0 } }
真正容易被忽略的是:iOS 上没有任何合规路径能拿到当前 WiFi 名称。别在真机上反复测试“为什么没返回”,那是系统设计如此;Android 上则务必把权限申请和字符串清洗写进主流程,而不是只放在 success 回调里。











