用于ssid的连接插件“ getWifiName”方法在iOS 13中的flutter中返回null

问题描述

我正在尝试使用连接插件在ios(13+)中获取wifi ssid,但结果返回null。我已经从Xcode添加了访问无线信息,但是仍然无法正常工作。有人可以帮忙吗?

Future<void> _updateConnectionStatus(ConnectivityResult result) async{
    switch(result){
      case ConnectivityResult.wifi:
        String wifiName;
        try {
          if (Platform.isIOS) {
            LocationAuthorizationStatus status =
            await _connectivity.getLocationServiceAuthorization();
            if (status == LocationAuthorizationStatus.notDetermined) {
              print('wifiName notDetermined: ');
              status = await _connectivity.requestLocationServiceAuthorization();
            }
            if (status == LocationAuthorizationStatus.authorizedAlways ||
                status == LocationAuthorizationStatus.authorizedWhenInUse) {
              print('wifiName authorizedWhenInUse: ');
              wifiName = await _connectivity.getWifiName();
              setState(() {
                _ssid = wifiName != null ? wifiName : _ssid;
              });

            } else {
              print('wifiName,.,: ');
              wifiName = await _connectivity.getWifiName();
            }
          } else {
            LocationAuthorizationStatus status =
            await _connectivity.getLocationServiceAuthorization();
//            if(status == )
            wifiName = await _connectivity.getWifiName();
            print('android wifi');
            print(wifiName);
          }
        } on PlatformException catch (e) {
          print(e.toString());
          wifiName = "Failed to get Wifi Name";
        }

        setState(() {
          _connectionStatus ='result '+ '$result\n'
              'Wifi Name: $wifiName\n';
          print('_connectionStatus $_connectionStatus');
        });
        break;
      case ConnectivityResult.mobile:
        Fluttertoast.showToast(msg: 'Connected to mobile network');
        break;
      case ConnectivityResult.none:
        Fluttertoast.showToast(msg: 'Connected to no network');
        setState(() => _connectionStatus = result.toString());
        break;
  default:
        setState(() => _connectionStatus = 'Failed to get connectivity.');
        break;
    }
  }

我已尝试使用以上来自连接插件示例的代码。还显示“从iOS 13开始,Apple宣布这些API将不再返回有效信息”。那么如何实现我的目标呢?

解决方法

在2020年,扑扑团队决定为wifi信息创建一个新的插件,并从connectivity插件中删除了这些方法。

因此,请检查wifi_info_flutter插件:方法签名是相同的。

根据package's readme,有关在iOS 13+上能够访问它的信息:

CNCopyCurrentNetworkInfo将适用于以下应用程序:

  • 该应用使用核心位置,并获得用户的使用授权 位置信息。

  • 该应用使用NEHotspotConfiguration API配置当前 Wi-Fi网络。

  • 该应用已安装了活动的VPN配置。

如果您的应用属于最后两个类别,它将按原样运行。 如果您的应用程序不属于最后两个类别,而您仍然 需要访问wifi信息,您应该请求用户的 授权使用位置信息。

此插件提供了一个帮助程序方法来请求 位置授权:requestLocationServiceAuthorization。至 请求位置授权,请确保将以下密钥添加到 您的Info.plist文件,位于/ios/Runner/Info.plist:

NSLocationAlwaysAndWhenInUseUsageDescription-描述为什么要使用该应用 需要一直访问用户的位置信息 (前景和背景)。这称为隐私-始终定位 和可视化编辑器中的“使用时使用情况说明”。 NSLocationWhenInUseUsageDescription-描述应用为何需要 当应用在以下位置运行时,访问用户的位置信息 前景。这称为隐私-使用时的位置用法 在视觉编辑器中进行说明。

因此,基本上,从iOS13开始,您必须请求用户的位置许可-这实际上是有道理的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...