An open API service indexing awesome lists of open source software.

https://github.com/nizwar/openvpn_flutter

A package that allow you to connect OpenVPN service with Flutter
https://github.com/nizwar/openvpn_flutter

android flutter ios vpn

Last synced: about 1 year ago
JSON representation

A package that allow you to connect OpenVPN service with Flutter

Awesome Lists containing this project

README

          

Connect to the OpenVPN service using Flutter. Contributions through issues and pull requests are highly appreciated!

## Android Setup

### 1. Permission Handler

#### Java
Include the following code in the `onActivityResult` method of `MainActivity.java` (if you are using Java):

```java
OpenVPNFlutterPlugin.connectWhileGranted(requestCode == 24 && resultCode == RESULT_OK);
```

The complete method should look like this:

```java
...
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);
}
```

#### Kotlin
Include the following code in the `onActivityResult` method of `MainActivity.kt` (if you are using Kotlin):

```kotlin
OpenVPNFlutterPlugin.connectWhileGranted(requestCode == 24 && resultCode == RESULT_OK);
```

The complete method should look like this:

```kotlin
...
import id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin
...
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
OpenVPNFlutterPlugin.connectWhileGranted(requestCode == 24 && resultCode == RESULT_OK)
super.onActivityResult(requestCode, resultCode, data)
}
```

### 2. App Bundle Build Not Connecting

If you encounter issues with the app not connecting using the latest Flutter SDK, apply the following quick fix:

Ensure that you include the following attribute within the `` tag in your `AndroidManifest.xml` file:

```xml

```

## iOS Setup

### 1. Add Capabilities

Add the `App Groups` and `Network Extensions` capabilities to the Runner's target. Refer to the image below for detailed instructions:

### 2. Add New Target

Click the `+` button on the bottom left, choose `NETWORK EXTENSION`, and follow the instructions in the image below:

Add the same capabilities to the VPNExtension as you did for the Runner's target:

### 3. Copy and Paste

Add the following lines to your Podfile (`ios/Podfile`):

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

Open `VPNExtension > PacketTunnelProvider.swift` and copy-paste the script from [PacketTunnelProvider.swift](https://raw.githubusercontent.com/nizwar/openvpn_flutter/master/example/ios/VPNExtension/PacketTunnelProvider.swift).

## Note

You must use iOS devices instead of the simulator to connect.

## Recipe

### Initialize

Before starting, initialize the OpenVPN plugin:

```dart
late OpenVPN openvpn;

@override
void initState() {
openvpn = OpenVPN(onVpnStatusChanged: _onVpnStatusChanged, onVpnStageChanged: _onVpnStageChanged);
openvpn.initialize(
groupIdentifier: "GROUP_IDENTIFIER", ///Example 'group.com.laskarmedia.vpn'
providerBundleIdentifier: "NETWORK_EXTENSION_IDENTIFIER", ///Example 'id.laskarmedia.openvpnFlutterExample.VPNExtension'
localizedDescription: "LOCALIZED_DESCRIPTION" ///Example 'Laskarmedia VPN'
);
}

void _onVpnStatusChanged(VPNStatus? vpnStatus){
setState((){
this.status = vpnStatus;
});
}

void _onVpnStageChanged(VPNStage? stage){
setState((){
this.stage = stage;
});
}
```

### Connect to VPN

```dart
void connect() {
openvpn.connect(
config,
name,
username: username,
password: password,
bypassPackages: [],
// In iOS connection can get stuck in "connecting" if this flag is "false".
// Solution is to switch it to "true".
certIsRequired: false,
);
}
```

### Disconnect

```dart
void disconnect(){
openvpn.disconnect();
}
```

# Publishing to Play Store and App Store

### Android

1. You can use app bundles to publish the app.
2. Add the following to your files in the `android` folder (special thanks to https://github.com/nizwar/openvpn_flutter/issues/10). Otherwise, the connection may not be established in some cases and will silently report "disconnected" when trying to connect. This is likely related to some symbols being stripped by Google Play.

```
gradle.properties > android.bundle.enableUncompressedNativeLibs=false
AndroidManifest > android:extractNativeLibs="true" in the application tag
```

Add the following inside the `android` tag in `app/build.gradle`:

```gradle
android {
...
//from here ======
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
}

packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}

bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = false
}
}
//to here
...
}
```

#### Notifications

As the plugin shows notifications for connection status and connection details, you must request permission using third-party packages.

Example using [permission_handler](https://pub.dev/packages/permission_handler):

```dart
///Put it anywhere you wish, like once you initialize the VPN or pre-connect to the server
Permission.notification.isGranted.then((_) {
if (!_) Permission.notification.request();
});
```

### iOS

1. View [Apple Guidelines](https://developer.apple.com/app-store/review/guidelines/#vpn-apps) relating to VPN.
2. This plugin DOES use encryption, but it uses exempt encryptions.

## Licenses

* [openvpn_flutter](https://github.com/nizwar/openvpn_flutter/blob/master/LICENSE) for this plugin
* [ics-openvpn](https://github.com/schwabe/ics-openvpn) for the Android engine
* [OpenVPNAdapter](https://github.com/ss-abramchuk/OpenVPNAdapter) for the iOS engine

# Support

If you appreciate my work, don't forget to give a thumbs up or support me with a cup of coffee.