Flutter iOS端network_info_plus.getWifiName()始终返回null的问题求助
问题分析
从你的描述来看,核心矛盾是iOS 18.1.1环境下,哪怕配置了权限描述、开启了Access Wi-Fi Information entitlement,getWifiName()依然返回null,而且App甚至没出现在系统位置服务列表里——这说明权限请求的链路大概率有断点,结合iOS 14+的权限收紧和iOS 18的新特性,我整理了几个最可能的原因和解决步骤:
针对性解决步骤
1. 你漏了「精确位置权限」的请求(iOS 14+强制要求)
从iOS 14开始,获取WiFi SSID不仅需要基础位置权限,还必须开启精确位置——默认的降低精度权限根本拿不到WiFi信息。你的原始代码既没主动请求精确位置,Info.plist也没配对应描述,这是最可能的根因。
解决操作:
- 先给
Info.plist添加精确位置的临时授权描述:<key>NSLocationTemporaryUsageDescriptionDictionary</key> <dict> <key>PreciseLocationAccuracy</key> <string>需要精确位置权限来获取当前连接的WiFi名称</string> </dict> - 修改代码,主动请求权限并验证状态:
Future<List<WifiNetwork>> getScanResults() async { if (Platform.isIOS) { // 第一步:请求基础位置权限 var locationStatus = await Permission.locationWhenInUse.status; if (locationStatus.isDenied || locationStatus.isRestricted) { locationStatus = await Permission.locationWhenInUse.request(); if (!locationStatus.isGranted) { print('iOS: 位置权限被拒绝,无法获取WiFi信息'); return []; } } // 第二步:请求精确位置权限(iOS 14+必加) var preciseStatus = await Permission.locationAccuracy.status; if (preciseStatus.isDenied) { preciseStatus = await Permission.locationAccuracy.request(); if (!preciseStatus.isGranted) { print('iOS: 精确位置权限被拒绝,无法获取WiFi信息'); return []; } } // 权限都到位后再获取SSID final ssid = await info.getWifiName(); if (ssid != null) { print('iOS: 当前连接的SSID是 $ssid'); return [WifiNetwork(ssid)]; } else { print('iOS: 无法获取当前连接的WiFi SSID'); return []; } } return []; }
2. Provisioning Profile没同步Access Wi-Fi Information entitlement
虽然你在Xcode的Capabilities里开了这个选项,但Xcode经常会偷懒不自动更新Provisioning Profile,导致entitlement没被真正写入配置文件——付费账号也逃不过这个坑。
解决操作:
- 打开Xcode的
Signing & Capabilities面板,先关闭Access Wi-Fi Information; - 执行
Cmd+Shift+K清理构建缓存; - 重新开启
Access Wi-Fi Information,然后在Signing面板的Provisioning Profile下拉框里点击Download Manual Profiles; - 验证Entitlements文件:确保
YourApp.entitlements里存在这一行:<key>com.apple.developer.networking.wifi-info</key> <true/>
3. network_info_plus版本不兼容iOS 18
你的Flutter版本是3.32.7(stable),但如果network_info_plus版本太老,可能还没适配iOS 18的权限逻辑。
解决操作:
打开pubspec.yaml,把network_info_plus升级到最新稳定版(当前最新稳定版是8.0.0左右),然后执行flutter pub upgrade。
4. 为什么App没出现在位置服务列表里?
这是因为App从来没成功触发过有效的权限请求——你的原始代码里没有主动请求权限,系统即使弹了弹窗,也可能没正确记录权限状态。按步骤1修改代码后,主动请求权限,App就会出现在位置服务列表里。
额外验证点
- 必须用真机测试:模拟器无法获取真实WiFi信息;
- 避开企业级WiFi/需要网页认证的WiFi:这类网络可能会被系统拦截SSID返回;
- 手动检查iPhone设置:
设置→隐私与安全性→位置服务里,你的App权限必须是使用App期间,且精确位置是开启状态。
快速测试权限的小工具
修改完后,可以先单独跑这个方法确认权限状态:
Future<void> testPermissions() async { if (Platform.isIOS) { final locationStatus = await Permission.locationWhenInUse.status; final preciseStatus = await Permission.locationAccuracy.status; print('位置权限状态: $locationStatus'); print('精确位置权限状态: $preciseStatus'); } }
只有当两个权限状态都是granted时,再调用getWifiName(),大概率就能拿到正确的SSID了。




