Flutter VPN管理插件openvpn_flutter_update的使用

Flutter VPN管理插件openvpn_flutter_update的使用

Android Setup

1. 权限处理器

在MainActivity.java中的onActivityResult方法中添加以下代码:

    import id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin;
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        OpenVPNFlutterPlugin.connectWhileGranted(requestCode == 24 && resultCode == RESULT_OK);
        super.onActivityResult(requestCode, resultCode, data);
    }

iOS Setup

1. 添加功能

在Runner的目标中添加两个功能:App GroupsNetwork Extensions。请参考以下图片以获取更详细的信息。

App Groups 和 Network Extensions

2. 添加新目标

点击左下角的+按钮,选择NETWORK EXTENSION,并遵循以下图片中的说明。

添加新的网络扩展目标

在VPNExtension中添加功能,操作方式与Runner相同。

在VPNExtension中添加功能

3. 复制粘贴

在Podfile文件(ios/Podfile)中添加以下内容:

target 'VPNExtension' do
  use_frameworks!
  pod 'OpenVPNAdapter', :git => 'https://github.com/ss-abramchuk/OpenVPNAdapter.git', :tag => '0.8.0'
end

打开VPNExtension > PacketTunnelProvider.swift文件,并复制粘贴以下脚本。

复制粘贴PacketTunnelProvider.swift

注意事项

您必须使用iOS设备而不是模拟器来连接。

示例代码

以下是一个完整的示例代码,展示了如何使用openvpn_flutter_update插件来管理和控制OpenVPN服务。

import 'dart:io';

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:openvpn_flutter/openvpn_flutter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late OpenVPN engine;
  VpnStatus? status;
  VPNStage? stage;
  bool _granted = false;

  [@override](/user/override)
  void initState() {
    engine = OpenVPN(
      onVpnStatusChanged: (data) {
        setState(() {
          status = data;
        });
      },
      onVpnStageChanged: (data, raw) {
        setState(() {
          stage = data;
        });
      },
    );

    engine.initialize(
      groupIdentifier: "group.com.laskarmedia.vpn",
      providerBundleIdentifier: "id.laskarmedia.openvpnFlutterExample.VPNExtension",
      localizedDescription: "VPN by Nizwar",
      lastStage: (stage) {
        setState(() {
          this.stage = stage;
        });
      },
      lastStatus: (status) {
        setState(() {
          this.status = status;
        });
      },
    );
    super.initState();
  }

  Future<void> initPlatformState() async {
    engine.connect(config, "USA",
        username: defaultVpnUsername,
        password: defaultVpnPassword,
        certIsRequired: true);
    if (!mounted) return;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Text(stage?.toString() ?? VPNStage.disconnected.toString()),
              Text(status?.toJson().toString() ?? ""),
              TextButton(
                child: const Text("Start"),
                onPressed: () {
                  initPlatformState();
                },
              ),
              TextButton(
                child: const Text("STOP"),
                onPressed: () {
                  engine.disconnect();
                },
              ),
              if (Platform.isAndroid)
                TextButton(
                  child: Text(_granted ? "Granted" : "Request Permission"),
                  onPressed: () {
                    engine.requestPermissionAndroid().then((value) {
                      setState(() {
                        _granted = value;
                      });
                    });
                  },
                ),
            ],
          ),
        ),
      ),
    );
  }
}

const String defaultVpnUsername = "";
const String defaultVpnPassword = "";

String config = "YOUR OPENVPN CONFIG HERE";

更多关于Flutter VPN管理插件openvpn_flutter_update的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter VPN管理插件openvpn_flutter_update的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


openvpn_flutter_update 是一个用于 Flutter 的插件,它可以帮助你在 Flutter 应用中集成和管理 OpenVPN 连接。这个插件提供了一种简单的方式来启动、停止和管理 VPN 连接,并且支持从远程服务器更新 OpenVPN 配置文件。

以下是如何使用 openvpn_flutter_update 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 openvpn_flutter_update 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  openvpn_flutter_update: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 配置权限

AndroidManifest.xml 文件中,添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

对于 iOS,你需要在 Info.plist 文件中添加以下权限:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

3. 初始化插件

在你的 Dart 代码中,初始化 openvpn_flutter_update 插件:

import 'package:openvpn_flutter_update/openvpn_flutter_update.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await OpenVPN.init();
  runApp(MyApp());
}

4. 启动 VPN 连接

你可以使用 OpenVPN.startVPN 方法来启动 VPN 连接。你需要提供一个 OpenVPN 配置文件(.ovpn 文件)的路径或 URL:

void startVPN() async {
  try {
    String config = '''
    client
    dev tun
    proto udp
    remote your.vpn.server.com 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert client.crt
    key client.key
    remote-cert-tls server
    cipher AES-256-CBC
    auth SHA256
    comp-lzo
    verb 3
    ''';
    
    await OpenVPN.startVPN(
      config,
      username: 'your_username',
      password: 'your_password',
    );
  } catch (e) {
    print('Error starting VPN: $e');
  }
}

5. 停止 VPN 连接

你可以使用 OpenVPN.stopVPN 方法来停止 VPN 连接:

void stopVPN() async {
  await OpenVPN.stopVPN();
}

6. 监听 VPN 状态

你可以使用 OpenVPN.vpnStatusStream 来监听 VPN 连接的状态变化:

StreamSubscription<VpnStatus>? _vpnStatusSubscription;

void listenToVPNStatus() {
  _vpnStatusSubscription = OpenVPN.vpnStatusStream.listen((status) {
    print('VPN Status: ${status.toString()}');
  });
}

[@override](/user/override)
void dispose() {
  _vpnStatusSubscription?.cancel();
  super.dispose();
}

7. 更新配置文件

你可以使用 OpenVPN.updateConfig 方法来更新 OpenVPN 配置文件:

void updateConfig() async {
  String newConfig = '''
  client
  dev tun
  proto udp
  remote new.vpn.server.com 1194
  resolv-retry infinite
  nobind
  persist-key
  persist-tun
  ca ca.crt
  cert client.crt
  key client.key
  remote-cert-tls server
  cipher AES-256-CBC
  auth SHA256
  comp-lzo
  verb 3
  ''';
  
  await OpenVPN.updateConfig(newConfig);
}

8. 处理错误

在处理 VPN 连接时,可能会遇到各种错误。你可以使用 try-catch 块来捕获并处理这些错误:

void startVPN() async {
  try {
    await OpenVPN.startVPN(config);
  } catch (e) {
    print('Error starting VPN: $e');
  }
}

9. 清理资源

在应用退出或不再需要 VPN 连接时,确保停止 VPN 连接并取消监听:

[@override](/user/override)
void dispose() {
  OpenVPN.stopVPN();
  _vpnStatusSubscription?.cancel();
  super.dispose();
}
回到顶部