Connect OpenVPN service with Flutter, Issues and PRs are very welcome!
Add this to your onActivityResult in MainActivity.java (if you are using Java)
OpenVPNFlutterPlugin.connectWhileGranted(requestCode == 24 && resultCode == RESULT_OK);
So it look like this
...
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);
}
Add this to your onAcivityResult in MainActivity.kt (if you are using Kotlin)
OpenVPNFlutterPlugin.connectWhileGranted(requestCode == 24 && resultCode == RESULT_OK);
So it look like this
...
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)
}
Add 2 capabillity on Runner's Target, App Groups and Network Extensions, Look at the image below to get clearer details
Click + button on bottom left, Choose NETWORK EXTENSION, and follow instruction's image bellow
Add Capabillity on VPNExtension, Do it same like Runner's Capabillitiy
Add the following lines to your Podfile (ios/Podfile
)
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 this script PacketTunnelProvider.swift
You must use iOS Devices instead of Simulator to connect
Before start, you have to initialize the OpenVPN plugin.
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;
});
}
void connect() {
openvpn.connect(
config,
name,
username: username,
password: password,
bypassPackages: [],
// In iOS connection can stuck in "connecting" if this flag is "false".
// Solution is to switch it to "true".
certIsRequired: false,
);
}
void disconnect(){
openvpn.disconnect();
}
- You can use appbundle to publish the app
- Add this to your files in
android
folder (special thanks to #10). Otherwise connection will not be established in some cases and will siliently report "disconnected" when trying to connect. Most likely it's related to some symbols stripping by Google Play.
gradle.properties > android.bundle.enableUncompressedNativeLibs=false
AndroidManifest > android:extractNativeLibs="true" in application tag
app/build.gradle add these inside android tag
android{
...
//from here ======
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
}
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = false
}
}
//to here
...
}
As the plugin shows notification for connection status and connection detail, you have to request permission by using 3rd-party packages.
Example by using permission_handler
///Put it anywhere you wish like once you initialize the vpn or pre-connect the server
Permission.notification.isGranted.then((_) {
if (!_) Permission.notification.request();
});
- View Apple Guidelines Relating to VPN
- This plugin DOES use Encryption BUT, It uses Exempt Encryptions
- openvpn_flutter for this plugin
- ics-openvpn for Android Engine
- OpenVPNAdapter for iOS Engine
Don't forget to give me a 👍 or support me with a cup of ☕️