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

从Xamarin迁移至MAUI后,如何建立VPN连接?是否有Android.Net替代方案

在MAUI中实现Android端VPN连接

MAUI本身没有跨平台的VPN统一抽象层,要在Android端建立VPN连接,依然需要借助Android原生的Android.Net.Vpn相关API——MAUI完全兼容这些原生API,实现逻辑和Xamarin.Android类似,只是代码组织方式适配MAUI的结构。

核心实现步骤

1. 配置Android权限与服务声明

在Platforms/Android/AndroidManifest.xml中添加VPN必需的权限和服务声明:

<!-- 添加VPN权限 -->
<uses-permission android:name="android.permission.BIND_VPN_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- 声明VPN服务 -->
<application ...>
  <service android:name=".MyVpnService"
           android:permission="android.permission.BIND_VPN_SERVICE">
    <intent-filter>
      <action android:name="android.net.VpnService" />
    </intent-filter>
  </service>
</application>

2. 实现Android原生VPN服务

在Platforms/Android目录下创建VPN服务类,继承自VpnService,实现核心连接逻辑:

using Android.App;
using Android.Content;
using Android.Net;
using Android.OS;

namespace YourMauiApp.Platforms.Android;

[Service(Permission = "android.permission.BIND_VPN_SERVICE")]
[IntentFilter(new[] { "android.net.VpnService" })]
public class MyVpnService : VpnService
{
    private VpnService.Builder? _vpnBuilder;
    private ParcelFileDescriptor? _vpnInterface;

    public override StartCommandResult OnStartCommand(Intent? intent, StartCommandFlags flags, int startId)
    {
        if (intent?.Action == "START_VPN")
        {
            EstablishVpnConnection();
        }
        else if (intent?.Action == "STOP_VPN")
        {
            StopVpnConnection();
        }
        return StartCommandResult.Sticky;
    }

    private void EstablishVpnConnection()
    {
        _vpnBuilder = new VpnService.Builder()
            .SetSession("My MAUI VPN")
            .SetAddress(InetAddress.Parse("10.0.0.2"), 32)
            .SetRoute("0.0.0.0", 0) // 路由所有流量
            .SetDnsServer(InetAddress.Parse("8.8.8.8"));

        // 启动VPN连接,需要用户授权
        var intent = _vpnBuilder.BuildIntent();
        StartActivity(intent.AddFlags(ActivityFlags.NewTask));
    }

    private void StopVpnConnection()
    {
        _vpnInterface?.Close();
        _vpnInterface = null;
        StopSelf();
    }

    public override bool OnEstablish(ParcelFileDescriptor? parcelFileDescriptor)
    {
        _vpnInterface = parcelFileDescriptor;
        // 这里处理VPN隧道的数据读写逻辑,和Xamarin.Android一致
        return true;
    }
}

3. 在MAUI共享代码中调用VPN服务

通过平台特定代码触发Android端的VPN服务启动:

// 共享代码中的调用逻辑
public static void StartVpn()
{
#if ANDROID
    var context = Android.App.Application.Context;
    var intent = new Intent(context, typeof(YourMauiApp.Platforms.Android.MyVpnService));
    intent.SetAction("START_VPN");
    context.StartForegroundService(intent);
#endif
}

public static void StopVpn()
{
#if ANDROID
    var context = Android.App.Application.Context;
    var intent = new Intent(context, typeof(YourMauiApp.Platforms.Android.MyVpnService));
    intent.SetAction("STOP_VPN");
    context.StartService(intent);
#endif
}

关键说明

  • MAUI的Connectivity组件仅用于检测网络状态、切换网络等基础操作,无法实现VPN连接,必须依赖Android原生API。
  • 实现逻辑和Xamarin.Android高度相似,只是代码放在MAUI的Platforms/Android目录下,遵循MAUI的平台特定代码规范。
  • VPN连接需要用户手动授权,代码中通过BuildIntent()唤起系统授权界面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:31:35