问题描述
我正在尝试使用连接插件在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开始,您必须请求用户的位置许可-这实际上是有道理的。