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

https://github.com/zikwall/flutter_openvpn_16kb


https://github.com/zikwall/flutter_openvpn_16kb

Last synced: 5 months ago
JSON representation

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.