flutter_vpn_service

A Flutter plugin for managing VPN services on Android. This plugin allows you to programmatically establish and configure VPN connections, protect sockets, and handle network routing. It is primarily designed to be used within Flutter apps that need VPN capabilities.

Features

  • Prepare and establish a VPN connection.
  • Protect specific sockets from the VPN.
  • Set session information for the VPN.
  • Add IP addresses and routes to the VPN configuration.

Installation

1. Add the dependency to your pubspec.yaml:

dependencies:
  flutter_vpn_service:
    git:
      url: https://github.com/your_username/flutter_vpn_service.git

Alternatively, if you have published the package on pub.dev, you can add it like this:

dependencies:
  flutter_vpn_service: ^<latest_version>

2. Install the dependencies:

flutter pub get

3. Platform-Specific Configuration:

Android: The plugin currently supports Android and does not require any special configurations beyond the AndroidManifest.xml permissions above.

Usage

Here’s a basic guide on how to use the flutter_vpn_service plugin:

1. Prepare VPN

Before you can start using the VPN, you need to prepare it.

import 'package:flutter_vpn_service/flutter_vpn_service.dart';

Future<void> prepareVpn() async {
  bool isPrepared = await FlutterVpnService.prepare();
  if (isPrepared) {
    print("VPN is prepared and ready to use.");
  } else {
    print("VPN is already prepared.");
  }
}

2. Protect a Socket

You can protect specific sockets to use the VPN.

Future<void> protectSocket(int socket) async {
  bool success = await FlutterVpnService.protectSocket(socket);
  if (success) {
    print("Socket is now protected by VPN.");
  } else {
    print("Failed to protect the socket.");
  }
}

3. Set Session Name

Set a session name for the VPN connection.

Future<void> setSession(String session) async {
  bool success = await FlutterVpnService.setSession(session);
  if (success) {
    print("Session set to $session.");
  } else {
    print("Failed to set session.");
  }
}

4. Add Address

Add an IP address and its associated prefix length to the VPN configuration.

Future<void> addAddress(String address, int prefixLength) async {
  bool success = await FlutterVpnService.addAddress(address, prefixLength);
  if (success) {
    print("Address $address added with prefix length $prefixLength.");
  } else {
    print("Failed to add address.");
  }
}

5. Establish VPN

Finally, establish the VPN connection.

Future<void> establishVpn() async {
  bool success = await FlutterVpnService.establishVpn();
  if (success) {
    print("VPN connection established.");
  } else {
    print("Failed to establish VPN connection.");
  }
}

Example

Here is a complete example of how you can use the flutter_vpn_service plugin in your app:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter VPN Service',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter VPN Service Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              await FlutterVpnService.prepare();
              await FlutterVpnService.setSession("My VPN Session");
              await FlutterVpnService.addAddress("192.168.1.1", 32);
              await FlutterVpnService.establishVpn();
            },
            child: Text('Start VPN'),
          ),
        ),
      ),
    );
  }
}

Testing: This plugin is designed to work on Android. Make sure to test it on a physical device rather than an emulator, as VPN functionality may not work properly on an emulator.

Contributing

Contributions are welcome! Please feel free to open issues, submit pull requests, or suggest improvements.

1- Fork the repository. 2- Create your branch (git checkout -b feature-branch). 3- Commit your changes (git commit -am 'Add new feature'). 4- Push to the branch (git push origin feature-branch). 5- Create a new Pull Request.