You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter iOS端network_info_plus.getWifiName()始终返回null的问题求助

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没被真正写入配置文件——付费账号也逃不过这个坑。

解决操作

  1. 打开Xcode的Signing & Capabilities面板,先关闭Access Wi-Fi Information
  2. 执行Cmd+Shift+K清理构建缓存;
  3. 重新开启Access Wi-Fi Information,然后在Signing面板的Provisioning Profile下拉框里点击Download Manual Profiles
  4. 验证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就会出现在位置服务列表里。


额外验证点

  1. 必须用真机测试:模拟器无法获取真实WiFi信息;
  2. 避开企业级WiFi/需要网页认证的WiFi:这类网络可能会被系统拦截SSID返回;
  3. 手动检查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了。

火山引擎 最新活动