develop 才是最新的代码,同步自原作者的 develop 分支,但似乎该分支有点问题,所有依旧采用主分支.
A new Flutter plugin that uses OpenVpn.
- Depend on it Add this to your package's pubspec.yaml file:
dependencies:
flutter_openvpn: ^0.2.0
- Install it You can install packages from the command line:
with Flutter:
$ flutter pub get
Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.
- Import it Now in your Dart code, you can use:
import 'package:flutter_openvpn/flutter_openvpn.dart';
22
>= Android9.0
>= iOS
- After adding package to pubspec.yaml, Run build command
flutter build apk --debug //for android
flutter build ios --no-codesign //for ios
Ignore any build errors.
- Change minimum sdk to 22 :
- Open Your project in Android Studio.
- Open your MainActivity.java(or .kt for kotlin) file (Located in android/app/src/main/YOUR_PACKAGE_NAME/MainActivity)
- Override onActivityResult in your activity and add this code to function body
if (requestCode == 1) {
if (resultCode == RESULT_OK) {
FlutterOpenvpnPlugin.setPermission(true);
} else {
FlutterOpenvpnPlugin.setPermission(false);
}
}
- Finally import FlutterOpenVpn with this import statement
import com.topfreelancerdeveloper.flutter_openvpn.FlutterOpenvpnPlugin;
- Add VPN Entitlements
- Open ios/Runner.xcworkspace in xcode
- In Runner target -> Signing & Capabalities -> Click on "+ Capabality" button
- Add both "Network Extension" and "App Groups" capabalities
- Select ONLY "Packet Tunnel" form newly created Network Extension menu.
- Make sure your Bundle identifier is checked in App Groups.
- View This Screenshot for visual Guide
- Add Network Extension Target
- Below Runner target click on "+" button to add new target
- Search for "Network Extension" in newly opened page and click on next
- Give it a name(Without space) and make sure to select Swift as Language and Packet Tunnel as Provider Type.
- Click on finish and agree to any message relating to "Activating Extension"
- Repeat "Add VPN Entitlements" for newly created target as well
- View This Screenshot for visual Guide
- Change minimum platform target to iOS 9.0 :
- In Runner target -> Deployment Info -> change Target to iOS 9.0
- Repeat step 2 for your VPN Extension Target as well
- Add OpenVPNAdapter dependency to PodFile
- Open ios/PodFile
- Change your PodFile according to this:
.
.
.
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
//Add this part
target 'YOUR_TARGET_EXTENSION_NAME' do
use_frameworks!
use_modular_headers!
pod 'OpenVPNAdapter', :git => 'https://github.com/ss-abramchuk/OpenVPNAdapter.git', :tag => '0.7.0'
end
.
.
.
- Run 'pod install' command in /ios directory
- Disable Bitcode
- In Vpn Extension Target -> Build Settings
- Search for "Bitcode" and set it to NO
- Add code to PacketTunnelProvider
- Open VPNExtension folder/PacketTunnelProvider.swift in xcode.
- Replace all code with this and save
- Initilize plugin
FlutterOpenvpn.init(
localizedDescription: "ExampleVPN", //this is required only on iOS
providerBundleIdentifier: "com.topfreelancerdeveloper.flutterOpenvpnExample.RunnerExtension",//this is required only on iOS
//localizedDescription is the name of your VPN profile
//providerBundleIdentifier is the bundle id of your vpn extension
)
/* returns {"currentStatus" : "VPN_CURRENT_STATUS",
"expireAt" : "VPN_EXPIRE_DATE_STRING_IN_FORMAT(yyyy-MM-dd HH:mm:ss)",} if successful
returns null if failed
*/
View this for more info on VPN status Strings
- Add VPN Profile and connect
FlutterOpenvpn.lunchVpn(
ovpnFileContent, //content of your .ovpn file
(isProfileLoaded) => print('isProfileLoaded : $isProfileLoaded'),
(newVpnStatus) => print('vpnActivated : $newVpnStatus'),
expireAt: DateTime.now().add(Duration(seconds: 30)),
//(Optional) VPN automatically disconnects in next 30 seconds
)
. Recently I discovered an issue with plugin not working with appbundles . If you want to publish to play store use apks . view this issue to stay updated on the matter
. View Apple Guidelines Relating to VPN . This plugin DOES use Encryption BUT, It uses Exempt Encryptions