如何在.NET Maui中获取WiFi网络列表?Wifimanager已过时
在.NET Maui中获取WiFi网络列表的可行方案
由于WifiManager已过时,推荐通过**依赖服务(Dependency Service)**结合各平台原生API实现跨平台WiFi列表获取,以下是分平台的具体实现步骤:
1. 定义共享接口
先在共享项目中创建统一的WiFi服务接口,抽象获取网络列表的方法:
public interface IWifiService { Task<IEnumerable<string>> GetAvailableNetworksAsync(); }
2. Android平台实现
Android使用WifiManager.ScanResults获取扫描结果,需注意权限申请:
权限配置
在Platforms/Android/AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
服务实现类
[assembly: Dependency(typeof(WifiServiceAndroid))] namespace YourAppNamespace.Platforms.Android { public class WifiServiceAndroid : IWifiService { public async Task<IEnumerable<string>> GetAvailableNetworksAsync() { // 检查并申请定位权限(Android 10+必须) var permissionStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (permissionStatus != PermissionStatus.Granted) { permissionStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (permissionStatus != PermissionStatus.Granted) { return Enumerable.Empty<string>(); } } var wifiManager = Android.App.Application.Context.GetSystemService(Context.WifiService) as WifiManager; if (wifiManager == null || !wifiManager.IsWifiEnabled) { return Enumerable.Empty<string>(); } // 触发WiFi扫描 wifiManager.StartScan(); // 短暂等待扫描完成(更严谨的方式是监听SCAN_RESULTS_AVAILABLE_ACTION广播) await Task.Delay(1000); // 提取非空的SSID列表 return wifiManager.ScanResults .Select(result => result.Ssid) .Where(ssid => !string.IsNullOrEmpty(ssid)) .Distinct(); } } }
3. iOS平台实现
iOS对WiFi访问有严格限制,默认仅能获取当前连接的网络;如需获取所有附近WiFi,需向苹果申请com.apple.developer.networking.wifi-info权限(需特殊授权)。
权限配置
确保在Platforms/iOS/Info.plist中添加定位权限描述:
<key>NSLocationWhenInUseUsageDescription</key> <string>需要访问定位权限以获取WiFi网络信息</string>
服务实现类
[assembly: Dependency(typeof(WifiServiceIos))] namespace YourAppNamespace.Platforms.iOS { public class WifiServiceIos : IWifiService { public async Task<IEnumerable<string>> GetAvailableNetworksAsync() { // 检查并申请定位权限 var permissionStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (permissionStatus != PermissionStatus.Granted) { permissionStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (permissionStatus != PermissionStatus.Granted) { return Enumerable.Empty<string>(); } } var networks = new List<string>(); // 获取当前连接的WiFi网络 var currentNetwork = GetCurrentNetworkInfo(); if (currentNetwork != null) { networks.Add(currentNetwork.SSID); } // 若需获取所有附近WiFi,需向苹果申请com.apple.developer.networking.wifi-info权限 // 申请后可使用NEHotspotHelper相关API实现 return networks.Distinct(); } private CNCopyCurrentNetworkInfoResult GetCurrentNetworkInfo() { return UIDevice.CurrentDevice.CheckSystemVersion(14, 0) ? CNCopyCurrentNetworkInfo.CopyCurrentNetworkInfo() : CNCopyCurrentNetworkInfo.CopyCurrentNetworkInfo(null); } } }
4. Windows平台实现
Windows使用Windows.Devices.WiFi.WiFiAdapter扫描网络:
权限配置
在Platforms/Windows/Package.appxmanifest中添加网络权限:
<Capabilities> <Capability Name="internetClient" /> <Capability Name="privateNetworkClientServer" /> </Capabilities>
服务实现类
[assembly: Dependency(typeof(WifiServiceWindows))] namespace YourAppNamespace.Platforms.Windows { public class WifiServiceWindows : IWifiService { public async Task<IEnumerable<string>> GetAvailableNetworksAsync() { var networks = new List<string>(); var adapters = await WiFiAdapter.FindAllAdaptersAsync(); foreach (var adapter in adapters) { await adapter.ScanAsync(); foreach (var network in adapter.NetworkReport.AvailableNetworks) { networks.Add(network.Ssid); } } return networks.Distinct(); } } }
5. 在共享代码中调用
在ViewModel或页面中通过依赖服务获取实例并调用:
var wifiService = DependencyService.Get<IWifiService>(); var availableNetworks = await wifiService.GetAvailableNetworksAsync(); // 将结果绑定到UI或进行后续处理
内容的提问来源于stack exchange,提问作者Fernando Goncalves
相关产品推荐
相关产品推荐

