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

如何让.NET MAUI应用在后台运行?WiFi扫描场景实现求助

.NET MAUI后台持续扫描WiFi网络实现方案

1. 配置平台权限

WiFi扫描依赖位置和后台权限,各平台需手动配置:

  • Android:
    在Platforms/Android/AndroidManifest.xml中添加权限:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    

    Android 12+需在代码中动态申请后台位置权限,静态权限无法满足要求。

  • iOS:
    在Platforms/iOS/Info.plist中添加:

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>需要位置权限扫描WiFi网络</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>需要后台位置权限持续扫描WiFi网络</string>
    <key>UIBackgroundModes</key>
    <array>
        <string>location</string>
    </array>
    

    iOS仅能通过位置后台模式维持应用后台运行,WiFi扫描依赖位置服务触发。

2. 实现跨平台WiFi扫描接口

用MAUI依赖服务统一扫描逻辑,先定义接口:

public interface IWiFiScanner
{
    Task<List<string>> ScanNetworksAsync();
    void StartBackgroundScanning(Action<List<string>> onScanned);
    void StopBackgroundScanning();
}

3. 各平台后台扫描实现

Android平台

采用Android官方推荐的WorkManager实现周期性后台任务:

  1. 创建Worker类:
[Android.Runtime.Register("com.yourapp.WiFiScanWorker")]
public class WiFiScanWorker : Worker
{
    public WiFiScanWorker(Context context, WorkerParameters workerParams) : base(context, workerParams) { }

    public override Result DoWork()
    {
        var wifiManager = (WifiManager)ApplicationContext.GetSystemService(Context.WifiService);
        var scanResults = wifiManager.ScanResults;
        var ssids = scanResults.Select(r => r.Ssid).ToList();

        // 检测目标网络并执行自定义逻辑
        if (ssids.Contains("你的目标SSID"))
        {
            YourCustomMethod();
        }

        // 返回重复调度,维持周期性执行
        return Result.Repeat();
    }

    private void YourCustomMethod()
    {
        // 编写需执行的操作,如发送本地通知、更新本地存储等
    }
}
  1. 在MainActivity中初始化WorkManager并设置周期任务:
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    var constraints = new Constraints.Builder()
        .SetRequiredNetworkType(NetworkType.NotRequired)
        .Build();

    // 最小周期15分钟,Android系统限制
    var scanRequest = PeriodicWorkRequest.Builder.From<WiFiScanWorker>(TimeSpan.FromMinutes(15))
        .SetConstraints(constraints)
        .Build();

    WorkManager.GetInstance(ApplicationContext).EnqueueUniquePeriodicWork("WiFiScan", ExistingPeriodicWorkPolicy.Replace, scanRequest);
}

iOS平台

iOS后台任务限制严格,需结合BackgroundTasks框架与位置后台模式实现:

  1. 在AppDelegate中注册后台任务:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    BGTaskScheduler.Shared.Register("com.yourapp.WiFiScanTask", null, task =>
    {
        HandleWiFiScanTask(task as BGAppRefreshTask);
    });

    return base.FinishedLaunching(app, options);
}

private void HandleWiFiScanTask(BGAppRefreshTask task)
{
    task.ExpirationHandler = () => task.SetTaskCompleted(false);

    // 执行WiFi扫描逻辑
    var ssids = ScanWiFiNetworks();
    if (ssids.Contains("你的目标SSID"))
    {
        YourCustomMethod();
    }

    task.SetTaskCompleted(true);
    ScheduleNextScan();
}

private void ScheduleNextScan()
{
    var request = new BGAppRefreshTaskRequest("com.yourapp.WiFiScanTask");
    request.EarliestBeginDate = NSDate.FromTimeIntervalSinceNow(60 * 15); // 15分钟后调度
    try
    {
        BGTaskScheduler.Shared.Submit(request);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"后台任务提交失败: {ex.Message}");
    }
}

private List<string> ScanWiFiNetworks()
{
    // 结合CoreLocation与NetworkExtension实现WiFi扫描
    // 此处省略具体扫描逻辑,需调用iOS原生API
    return new List<string>();
}

4. 前台与后台联动

在MAUI共享项目中通过依赖服务调用平台扫描逻辑:

// 页面或ViewModel中
var scanner = DependencyService.Get<IWiFiScanner>();
scanner.StartBackgroundScanning((ssids) =>
{
    // 前台运行时更新UI
    MainThread.BeginInvokeOnMainThread(() =>
    {
        NetworkList = new ObservableCollection<string>(ssids);
    });

    // 检测目标网络触发操作
    if (ssids.Contains("目标SSID"))
    {
        ExecuteCustomAction();
    }
});

5. 关键注意事项

  • Android:后台扫描周期不能低于15分钟,否则WorkManager拒绝调度;必须获取用户授权的后台位置权限。
  • iOS:后台任务单次执行时间不超过30秒,扫描逻辑需轻量化;用户必须授予“始终允许”位置权限,否则后台任务无法触发。
  • 后台运行时避免耗时操作,优先用本地通知反馈结果,后台无法直接更新UI。

内容的提问来源于stack exchange,提问作者loury Pe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:55:33