You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:53:07