diff --git a/.DS_Store b/.DS_Store index c7eb695..85e8119 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 69affb1..4b2ed46 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,139 @@ app-profile.apk +# Do not remove or rename entries in this file, only add new ones +# See https://github.com/flutter/flutter/issues/128635 for more context. + +# Miscellaneous +*.class +*.lock +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.classpath +.project +.settings/ +.vscode/* + +# Flutter repo-specific +/bin/cache/ +/bin/internal/bootstrap.bat +/bin/internal/bootstrap.sh +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/devicelab/ABresults*.json +/dev/docs/doc/ +/dev/docs/api_docs.zip +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version +analysis_benchmark.json + +# packages file containing multi-root paths +.packages.generated + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +**/generated_plugin_registrant.dart +.packages +.pub-preload-cache/ +.pub-cache/ +.pub/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds + +# Android related +**/android/**/gradle-wrapper.jar +.gradle/ +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +*.jks + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/.last_build_id +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# macOS +**/Flutter/ephemeral/ +**/Pods/ +**/macos/Flutter/GeneratedPluginRegistrant.swift +**/macos/Flutter/ephemeral +**/xcuserdata/ + +# Windows +**/windows/flutter/generated_plugin_registrant.cc +**/windows/flutter/generated_plugin_registrant.h +**/windows/flutter/generated_plugins.cmake + +# Linux +**/linux/flutter/generated_plugin_registrant.cc +**/linux/flutter/generated_plugin_registrant.h +**/linux/flutter/generated_plugins.cmake + +# Coverage +coverage/ + +# Symbols +app.*.symbols + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock +!.vscode/settings.json diff --git a/README.md b/README.md index 013f8d1..e6482df 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,76 @@ # UUVPN -基于Flutter开发的VPN客户端(ios/android),自主设计,精美UI,优化VPN速度,完全开源。~~[停止维护]~~ +基于Flutter开发的VPN客户端(ios/android),自主设计,精美UI,优化VPN速度,完全开源。 -UUVPN client (ios/android) developed based on Flutter, self-designed, exquisite UI, optimized VPN speed, completely open source. ~~[Stop maintenance]~~ - -[ReadME.Old](https://github.com/nicolastinkl/UUVPN/blob/main/README.old.md) ![](screenshots/Snipaste_2023-06-25_11-38-47.png) - -# 推荐 3 个开源的替代品,很强很完美 -# Recommend 3 open source alternatives, very powerful and perfect - -| Feature/Aspect | [ClashMetaForAndroid](https://github.com/MetaCubeX/ClashMetaForAndroid) | [sing-box](https://github.com/SagerNet/sing-box) | [hiddify-next](https://github.com/hiddify/hiddify-next?tab=readme-ov-file) | -|---------------------------------|------------------------------------------------------|------------------------------|-----------------------------------------| -| **Platform** | Android | Android, iOS, Windows, macOS and Linux | Android, Windows, macOS and Linux platforms | -| **Interface** | Graphical User Interface | Command Line Interface | Graphical User Interface | -| **Protocol Support** | Clash.Meta protocols | 🟡 Wide range of protocols: Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH etc. | Multiple protocols | -| **Automation** | Yes, via intents | Limited | Limited | -| **Security** | Moderate | High | High | -| **Performance** | Moderate | High | Moderate | -| **Ease of Setup** | Moderate, requires OpenJDK, Android SDK, CMake, Golang| Complex | Easy | -| **Community & Support** | Active community, regular updates | Active community, limited documentation | Active community, regular updates | -| **Customization** | Limited | High | Moderate | -| **Main Use Case** | Android users needing a GUI-based proxy solution | Users needing a high-performance proxy platform | Users prioritizing privacy and ease of use | +# UUVPN +A flutter application for [V2Board](https://github.com/v2board/v2board) ~~and [SSPanel-Uim](https://github.com/Anankke/SSPanel-Uim)~~ + +support iOS application and Android now. + +**IF THIS PROJECT HELPS YOU, PLEASE GIVE ME A LITTLE STAR⭐️.** + +## Screenshots +![](screenshots/page_7.png) + +## App Store +![](screenshots/Snipaste_2023-06-10_14-21-20.png) + +## Environment + +- Flutter Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git + Framework • revision d3d8effc68 (6 weeks ago) • 2023-05-16 17:59:05 -0700 + Engine • revision b4fb11214d + Tools • Dart 3.0.1 • DevTools 2.23.1 + - Download this version url: https://drive.google.com/file/d/1ksM4_PK9Ibk7ycyrfF7XffM_99_4JYV3/view?usp=sharing + - leaf sdk downlaod url: https://github.com/eycorsican/leaf/releases/tag/v0.10.7 + +- macOS 13.3.1 + +- Xcode 14 + +- iOS 15.0 + + +## Installation + +```shell +flutter pub get +``` + +## Develop +```shell +flutter run +``` + +## Build +build android apk +```shell +flutter build apk +``` + +build ios +```shell +flutter build ios +``` + +---------------------- + +# How to use it? + + +- 1: Change Domain File Path : ~UUVPN/flutter/lib/constant/app_urls.dart + ``` + static const String baseUrl = "https://xxxx.com"; + ``` + +- 2: Xcode Settings: +![](screenshots/Snipaste_2023-12-05_09-48-45.png) +![](screenshots/Snipaste_2023-12-05_09-49-14.png) +![](screenshots/Snipaste_2023-12-05_09-49-23.png) +![](screenshots/4db2f52524536ff706c99472a767f6b6.gif) + +- 3: running screenshot: +![](screenshots/Snipaste_2023-12-05_15-43-54.png) \ No newline at end of file diff --git a/README.old.md b/README.old.md deleted file mode 100644 index e6482df..0000000 --- a/README.old.md +++ /dev/null @@ -1,76 +0,0 @@ -# UUVPN -基于Flutter开发的VPN客户端(ios/android),自主设计,精美UI,优化VPN速度,完全开源。 - - -![](screenshots/Snipaste_2023-06-25_11-38-47.png) - -# UUVPN - - -A flutter application for [V2Board](https://github.com/v2board/v2board) ~~and [SSPanel-Uim](https://github.com/Anankke/SSPanel-Uim)~~ - -support iOS application and Android now. - - -**IF THIS PROJECT HELPS YOU, PLEASE GIVE ME A LITTLE STAR⭐️.** - -## Screenshots -![](screenshots/page_7.png) - -## App Store -![](screenshots/Snipaste_2023-06-10_14-21-20.png) - - -## Environment - -- Flutter Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git - Framework • revision d3d8effc68 (6 weeks ago) • 2023-05-16 17:59:05 -0700 - Engine • revision b4fb11214d - Tools • Dart 3.0.1 • DevTools 2.23.1 - - Download this version url: https://drive.google.com/file/d/1ksM4_PK9Ibk7ycyrfF7XffM_99_4JYV3/view?usp=sharing - - leaf sdk downlaod url: https://github.com/eycorsican/leaf/releases/tag/v0.10.7 - -- macOS 13.3.1 + -- Xcode 14 + -- iOS 15.0 + - -## Installation - -```shell -flutter pub get -``` - -## Develop -```shell -flutter run -``` - -## Build -build android apk -```shell -flutter build apk -``` - -build ios -```shell -flutter build ios -``` - ----------------------- - -# How to use it? - - -- 1: Change Domain File Path : ~UUVPN/flutter/lib/constant/app_urls.dart - ``` - static const String baseUrl = "https://xxxx.com"; - ``` - -- 2: Xcode Settings: -![](screenshots/Snipaste_2023-12-05_09-48-45.png) -![](screenshots/Snipaste_2023-12-05_09-49-14.png) -![](screenshots/Snipaste_2023-12-05_09-49-23.png) -![](screenshots/4db2f52524536ff706c99472a767f6b6.gif) - -- 3: running screenshot: -![](screenshots/Snipaste_2023-12-05_15-43-54.png) \ No newline at end of file diff --git a/flutter/.DS_Store b/flutter/.DS_Store index 7fcd241..99e7387 100644 Binary files a/flutter/.DS_Store and b/flutter/.DS_Store differ diff --git a/flutter/README_zh-CN.md b/flutter/README_zh-CN.md deleted file mode 100644 index 3d2219c..0000000 --- a/flutter/README_zh-CN.md +++ /dev/null @@ -1,73 +0,0 @@ -[English](./README.md) | 简体中文 - -# Sail - -![Flutter](https://img.shields.io/badge/Flutter-02569B?style=for-the-badge&logo=flutter&logoColor=white) -![Rust](https://img.shields.io/badge/Rust-000000?style=for-the-badge&logo=rust&logoColor=white) -![Kotlin](https://img.shields.io/badge/Kotlin-0095D5?&style=for-the-badge&logo=kotlin&logoColor=white) -![Swift](https://img.shields.io/badge/Swift-FA7343?style=for-the-badge&logo=swift&logoColor=white) -![iOS](https://img.shields.io/badge/iOS-000000?style=for-the-badge&logo=ios&logoColor=white) -![Android](https://img.shields.io/badge/Android-3DDC84?style=for-the-badge&logo=android&logoColor=white) - -[![Flutter](https://github.com/sail-tunnel/sail/actions/workflows/flutter.yml/badge.svg)](https://github.com/sail-tunnel/sail/actions/workflows/flutter.yml) - -使用 [Flutter](https://github.com/flutter/flutter) 为 [V2Board](https://github.com/v2board/v2board) ~~及 [SSPanel-Uim](https://github.com/Anankke/SSPanel-Uim) 构建的应用~~ - -现在支持iOS而非Android, 我没有Android设备😂. - -重现 [Mohammad Reza Farahzad 的设计](https://dribbble.com/shots/14028358-VPN-App-Ui-Design?utm_source=Clipboard_Shot&utm_campaign=mrfarahzad&utm_content=VPN%20App%20Ui%20Design&utm_medium=Social_Share) - -**如果这个项目对你有帮助,请给我一颗小星星⭐️。** - -## 截图 - -Screenshot -Screenshot -Screenshot - -## 资源 -- [Mohammad Reza Farahzad 的设计](https://dribbble.com/shots/14028358-VPN-App-Ui-Design?utm_source=Clipboard_Shot&utm_campaign=mrfarahzad&utm_content=VPN%20App%20Ui%20Design&utm_medium=Social_Share) -- [flat flags](https://github.com/wobblecode/flat-flags) - -## 联络我 -[![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/sail-tunnel) -[![Gmail](https://img.shields.io/badge/Gmail-D14836?style=for-the-badge&logo=gmail&logoColor=white)](mailto:sail-tunnel@gmail.com) - -## 待办事项: -- [x] 支持安卓设备。 -- [ ] Dart ffi 与 iOS 和 android 来控制 vpn。 -- [x] 订单页面 -- [x] 我的设置页面 -- [x] 服务器列表页面支持 ping 操作。 -- [ ] 按Material主题重构颜色。 - -## 环境 - -- Flutter 3.0.1 -- Dart 2.17.1 -- macOS 12.4 -- IntelliJ IDEA 2022.1.1 (Ultimate Edition) (感谢 [jetbrains 开源计划](https://www.jetbrains.com/opensource/)) -- Xcode 13.4.1 -- iOS 15.5 - -## 安装 - -```shell -flutter pub get -``` - -## 开发 -```shell -flutter run -``` - -## 构建 -build android apk -```shell -flutter build apk -``` - -build ios -```shell -flutter build ios -``` diff --git a/flutter/android/app/src/main/kotlin/com/sail_tunnel/sail/MainActivity.kt b/flutter/android/app/src/main/kotlin/com/sail_tunnel/sail/MainActivity.kt index 20c876a..7d10ec6 100644 --- a/flutter/android/app/src/main/kotlin/com/sail_tunnel/sail/MainActivity.kt +++ b/flutter/android/app/src/main/kotlin/com/sail_tunnel/sail/MainActivity.kt @@ -22,7 +22,7 @@ import io.flutter.plugins.GeneratedPluginRegistrant import java.io.File class MainActivity: FlutterActivity() { - private val channel = "com.sail_tunnel.sail/vpn_manager" + private val channel = "com.vpntunnel.vpnzeus/vpn_manager" private fun getServiceIntent(): Intent { return Intent(this, TunnelService::class.java) diff --git a/flutter/ios/.DS_Store b/flutter/ios/.DS_Store index c9a6d7e..6216f43 100644 Binary files a/flutter/ios/.DS_Store and b/flutter/ios/.DS_Store differ diff --git a/flutter/ios/.gitattributes b/flutter/ios/.gitattributes new file mode 100644 index 0000000..352f149 --- /dev/null +++ b/flutter/ios/.gitattributes @@ -0,0 +1 @@ +*.a filter=lfs diff=lfs merge=lfs -text diff --git a/flutter/ios/PacketTunnel/PacketTunnel.entitlements b/flutter/ios/PacketTunnel/PacketTunnel.entitlements index 01727f1..26de67b 100644 --- a/flutter/ios/PacketTunnel/PacketTunnel.entitlements +++ b/flutter/ios/PacketTunnel/PacketTunnel.entitlements @@ -8,7 +8,7 @@ com.apple.security.application-groups - group.com.sail-tunnel.vpnzeus + group.com.vpntunnel.vpnzeus diff --git a/flutter/ios/Podfile b/flutter/ios/Podfile index 1e0d0e6..64e92d1 100644 --- a/flutter/ios/Podfile +++ b/flutter/ios/Podfile @@ -33,7 +33,7 @@ target 'Runner' do use_frameworks! use_modular_headers! # pod 'Leaf', :path => 'leaf.xcframework' - + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end diff --git a/flutter/ios/Podfile.lock b/flutter/ios/Podfile.lock index f583650..bc541fc 100644 --- a/flutter/ios/Podfile.lock +++ b/flutter/ios/Podfile.lock @@ -26,7 +26,7 @@ PODS: - PhoneNumberKit/PhoneNumberKitCore - shared_preferences_ios (0.0.1): - Flutter - - Toast (4.0.0) + - Toast (4.1.1) - url_launcher_ios (0.0.1): - Flutter - webview_flutter_wkwebview (0.0.1): @@ -79,10 +79,10 @@ SPEC CHECKSUMS: path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 PhoneNumberKit: ced55861269312a5e3bc2ef82a58d6255b1c976a shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad - Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 + Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de webview_flutter_wkwebview: b7e70ef1ddded7e69c796c7390ee74180182971f -PODFILE CHECKSUM: 2cac2355308eef43139d5b34f7a00e0eaa241759 +PODFILE CHECKSUM: de47e8edb5f824045744e95e4ae955933333d4a0 COCOAPODS: 1.15.2 diff --git a/flutter/ios/Runner.xcodeproj/project.pbxproj b/flutter/ios/Runner.xcodeproj/project.pbxproj index 1154897..d403fb0 100644 --- a/flutter/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter/ios/Runner.xcodeproj/project.pbxproj @@ -32,9 +32,9 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C09C70752C3E5685000F6E01 /* leaf.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; }; + C09C70762C3E5685000F6E01 /* leaf.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C0CB10F62C3275EE00A1F217 /* leaf.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; }; - C0CB10F82C3276C300A1F217 /* leaf.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; }; - C0CB10F92C3276C300A1F217 /* leaf.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DBC6F25A26C78B1D91884CE1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A9C0075B77637136AF52D8B /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ @@ -70,13 +70,13 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - C0CB10F42C3275A300A1F217 /* Embed Frameworks */ = { + C09C70772C3E5685000F6E01 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - C0CB10F92C3276C300A1F217 /* leaf.xcframework in Embed Frameworks */, + C09C70762C3E5685000F6E01 /* leaf.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -110,7 +110,6 @@ 3EA6B277293F1D1600B2BABC /* URL+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Helpers.swift"; sourceTree = ""; }; 3EA6B279293F1FAD00B2BABC /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; }; 4A9C0075B77637136AF52D8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7F9A79C99E6BB92BFA8F918D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; @@ -123,6 +122,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C00A39D82C3E5F9D004E31E4 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; C0CB10F52C3275EE00A1F217 /* leaf.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = leaf.xcframework; sourceTree = ""; }; /* End PBXFileReference section */ @@ -131,8 +131,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C0CB10F82C3276C300A1F217 /* leaf.xcframework in Frameworks */, 7A31DD8228420C0B00E82EE1 /* NetworkExtension.framework in Frameworks */, + C09C70752C3E5685000F6E01 /* leaf.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -235,7 +235,7 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + C00A39D82C3E5F9D004E31E4 /* Runner-Bridging-Header.h */, ); path = Runner; sourceTree = ""; @@ -260,8 +260,8 @@ 2FD21F0925A363E300F556E0 /* Sources */, 2FD21F0A25A363E300F556E0 /* Frameworks */, C0DAE5F52C3272280023769C /* CopyFiles */, - C0CB10F42C3275A300A1F217 /* Embed Frameworks */, 2FD21F0B25A363E300F556E0 /* Resources */, + C09C70772C3E5685000F6E01 /* Embed Frameworks */, ); buildRules = ( ); @@ -282,9 +282,9 @@ 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, + 30B17F94E53B12A0859D0A8C /* [CP] Embed Pods Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 9740EEB61CF901F6004384FC /* Run Script */, - 30B17F94E53B12A0859D0A8C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -554,7 +554,8 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; + CURRENT_PROJECT_VERSION = 222; + DEVELOPMENT_TEAM = 26XWXKSR3B; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -563,7 +564,7 @@ INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = UUVPN; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -572,8 +573,9 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); + MARKETING_VERSION = 2.0.0; MODULEMAP_FILE = "${PROJECT_DIR}/LeafFFI/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = "com.sail-tunnel.vpnzeus"; + PRODUCT_BUNDLE_IDENTIFIER = com.vpntunnel.vpnzeus; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -600,7 +602,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnel/PacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 200; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 26XWXKSR3B; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; FRAMEWORK_SEARCH_PATHS = ( @@ -619,7 +621,7 @@ MARKETING_VERSION = 1.0.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.sail-tunnel.vpnzeus.PacketTunnel"; + PRODUCT_BUNDLE_IDENTIFIER = com.vpntunnel.vpnzeus.PacketTunnel; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -643,7 +645,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnel/PacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 200; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 26XWXKSR3B; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; FRAMEWORK_SEARCH_PATHS = ( @@ -661,7 +663,7 @@ LIBRARY_SEARCH_PATHS = "$(inherited)"; MARKETING_VERSION = 1.0.6; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.sail-tunnel.vpnzeus.PacketTunnel"; + PRODUCT_BUNDLE_IDENTIFIER = com.vpntunnel.vpnzeus.PacketTunnel; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = ""; @@ -683,7 +685,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnel/PacketTunnel.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 200; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 26XWXKSR3B; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; FRAMEWORK_SEARCH_PATHS = ( @@ -701,7 +703,7 @@ LIBRARY_SEARCH_PATHS = "$(inherited)"; MARKETING_VERSION = 1.0.6; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "com.sail-tunnel.vpnzeus.PacketTunnel"; + PRODUCT_BUNDLE_IDENTIFIER = com.vpntunnel.vpnzeus.PacketTunnel; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = ""; @@ -833,7 +835,8 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; + CURRENT_PROJECT_VERSION = 222; + DEVELOPMENT_TEAM = 26XWXKSR3B; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -842,7 +845,7 @@ INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = UUVPN; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -851,8 +854,9 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); + MARKETING_VERSION = 2.0.0; MODULEMAP_FILE = "${PROJECT_DIR}/LeafFFI/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = "com.sail-tunnel.vpnzeus"; + PRODUCT_BUNDLE_IDENTIFIER = com.vpntunnel.vpnzeus; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -877,7 +881,8 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; + CURRENT_PROJECT_VERSION = 222; + DEVELOPMENT_TEAM = 26XWXKSR3B; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -886,7 +891,7 @@ INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = UUVPN; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -895,8 +900,9 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); + MARKETING_VERSION = 2.0.0; MODULEMAP_FILE = "${PROJECT_DIR}/LeafFFI/module.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = "com.sail-tunnel.vpnzeus"; + PRODUCT_BUNDLE_IDENTIFIER = com.vpntunnel.vpnzeus; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/flutter/ios/Runner/AppDelegate.swift b/flutter/ios/Runner/AppDelegate.swift index 75d0008..1c5a9fe 100644 --- a/flutter/ios/Runner/AppDelegate.swift +++ b/flutter/ios/Runner/AppDelegate.swift @@ -12,7 +12,7 @@ import os GeneratedPluginRegistrant.register(with: self) let controller : FlutterViewController = window?.rootViewController as! FlutterViewController; - let vpnManagerChannel = FlutterMethodChannel.init(name: "com.sail_tunnel.sail/vpn_manager", + let vpnManagerChannel = FlutterMethodChannel.init(name: "com.vpntunnel.vpnzeus/vpn_manager", binaryMessenger: controller.binaryMessenger); let manager = VPNManager.shared() diff --git a/flutter/ios/Runner/Info.plist b/flutter/ios/Runner/Info.plist index ff632a9..797ec03 100644 --- a/flutter/ios/Runner/Info.plist +++ b/flutter/ios/Runner/Info.plist @@ -30,6 +30,7 @@ UIBackgroundModes + fetch remote-notification UILaunchStoryboardName diff --git a/flutter/ios/Runner/Runner-Bridging-Header.h b/flutter/ios/Runner/Runner-Bridging-Header.h index 308a2a5..2a22d07 100644 --- a/flutter/ios/Runner/Runner-Bridging-Header.h +++ b/flutter/ios/Runner/Runner-Bridging-Header.h @@ -1 +1,12 @@ +// +// Runner-Bridging-Header.h +// Runner +// +// Created by Zeus on 2024/7/10. +// + +#ifndef Runner_Bridging_Header_h +#define Runner_Bridging_Header_h + #import "GeneratedPluginRegistrant.h" +#endif /* Runner_Bridging_Header_h */ diff --git a/flutter/ios/Runner/Runner.entitlements b/flutter/ios/Runner/Runner.entitlements index bb09ac9..093c34d 100644 --- a/flutter/ios/Runner/Runner.entitlements +++ b/flutter/ios/Runner/Runner.entitlements @@ -10,7 +10,7 @@ com.apple.security.application-groups - group.com.sail-tunnel.vpnzeus + group.com.vpntunnel.vpnzeus diff --git a/flutter/ios/Shared/Helpers/FileManager+Helpers.swift b/flutter/ios/Shared/Helpers/FileManager+Helpers.swift index 013a4a9..80eb263 100644 --- a/flutter/ios/Shared/Helpers/FileManager+Helpers.swift +++ b/flutter/ios/Shared/Helpers/FileManager+Helpers.swift @@ -8,7 +8,7 @@ import Foundation extension FileManager { - static var appGroupId = "group.com.sail-tunnel.vpnzeus" + static var appGroupId = "group.com.vpntunnel.vpnzeus" private var sharedFolderURL: URL? { let appGroupId = FileManager.appGroupId diff --git a/flutter/ios/leaf.xcframework.zip b/flutter/ios/leaf.xcframework.zip deleted file mode 100644 index 4a19cb4..0000000 Binary files a/flutter/ios/leaf.xcframework.zip and /dev/null differ diff --git a/flutter/ios/leaf.xcframework/Info.plist b/flutter/ios/leaf.xcframework/Info.plist new file mode 100644 index 0000000..063f7f6 --- /dev/null +++ b/flutter/ios/leaf.xcframework/Info.plist @@ -0,0 +1,65 @@ + + + + + AvailableLibraries + + + BinaryPath + libleaf.a + HeadersPath + Headers + LibraryIdentifier + macos-arm64_x86_64 + LibraryPath + libleaf.a + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + macos + + + BinaryPath + libleaf.a + HeadersPath + Headers + LibraryIdentifier + ios-arm64 + LibraryPath + libleaf.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + BinaryPath + libleaf.a + HeadersPath + Headers + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + libleaf.a + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/flutter/ios/leaf.xcframework/ios-arm64/Headers/leaf.h b/flutter/ios/leaf.xcframework/ios-arm64/Headers/leaf.h new file mode 100644 index 0000000..4fb7b00 --- /dev/null +++ b/flutter/ios/leaf.xcframework/ios-arm64/Headers/leaf.h @@ -0,0 +1,119 @@ +#include +#include +#include +#include + +/** + * No error. + */ +#define ERR_OK 0 + +/** + * Config path error. + */ +#define ERR_CONFIG_PATH 1 + +/** + * Config parsing error. + */ +#define ERR_CONFIG 2 + +/** + * IO error. + */ +#define ERR_IO 3 + +/** + * Config file watcher error. + */ +#define ERR_WATCHER 4 + +/** + * Async channel send error. + */ +#define ERR_ASYNC_CHANNEL_SEND 5 + +/** + * Sync channel receive error. + */ +#define ERR_SYNC_CHANNEL_RECV 6 + +/** + * Runtime manager error. + */ +#define ERR_RUNTIME_MANAGER 7 + +/** + * No associated config file. + */ +#define ERR_NO_CONFIG_FILE 8 + +/** + * Starts leaf with options, on a successful start this function blocks the current + * thread. + * + * @note This is not a stable API, parameters will change from time to time. + * + * @param rt_id A unique ID to associate this leaf instance, this is required when + * calling subsequent FFI functions, e.g. reload, shutdown. + * @param config_path The path of the config file, must be a file with suffix .conf + * or .json, according to the enabled features. + * @param auto_reload Enabls auto reloading when config file changes are detected, + * takes effect only when the "auto-reload" feature is enabled. + * @param multi_thread Whether to use a multi-threaded runtime. + * @param auto_threads Sets the number of runtime worker threads automatically, + * takes effect only when multi_thread is true. + * @param threads Sets the number of runtime worker threads, takes effect when + * multi_thread is true, but can be overridden by auto_threads. + * @param stack_size Sets stack size of the runtime worker threads, takes effect when + * multi_thread is true. + * @return ERR_OK on finish running, any other errors means a startup failure. + */ +int32_t leaf_run_with_options(uint16_t rt_id, + const char *config_path, + bool auto_reload, + bool multi_thread, + bool auto_threads, + int32_t threads, + int32_t stack_size); + +/** + * Starts leaf with a single-threaded runtime, on a successful start this function + * blocks the current thread. + * + * @param rt_id A unique ID to associate this leaf instance, this is required when + * calling subsequent FFI functions, e.g. reload, shutdown. + * @param config_path The path of the config file, must be a file with suffix .conf + * or .json, according to the enabled features. + * @return ERR_OK on finish running, any other errors means a startup failure. + */ +int32_t leaf_run(uint16_t rt_id, const char *config_path); + +int32_t leaf_run_with_config_string(uint16_t rt_id, const char *config); + +/** + * Reloads DNS servers, outbounds and routing rules from the config file. + * + * @param rt_id The ID of the leaf instance to reload. + * + * @return Returns ERR_OK on success. + */ +int32_t leaf_reload(uint16_t rt_id); + +/** + * Shuts down leaf. + * + * @param rt_id The ID of the leaf instance to reload. + * + * @return Returns true on success, false otherwise. + */ +bool leaf_shutdown(uint16_t rt_id); + +/** + * Tests the configuration. + * + * @param config_path The path of the config file, must be a file with suffix .conf + * or .json, according to the enabled features. + * @return Returns ERR_OK on success, i.e no syntax error. + */ +int32_t leaf_test_config(const char *config_path); diff --git a/flutter/ios/leaf.xcframework/ios-arm64/Headers/module.modulemap b/flutter/ios/leaf.xcframework/ios-arm64/Headers/module.modulemap new file mode 100644 index 0000000..138d37a --- /dev/null +++ b/flutter/ios/leaf.xcframework/ios-arm64/Headers/module.modulemap @@ -0,0 +1,4 @@ +module leaf { + header "leaf.h" + export * +} diff --git a/flutter/ios/leaf.xcframework/ios-arm64/libleaf.a b/flutter/ios/leaf.xcframework/ios-arm64/libleaf.a new file mode 100644 index 0000000..cb000a6 --- /dev/null +++ b/flutter/ios/leaf.xcframework/ios-arm64/libleaf.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dbcc15712911277195419d6de4edfbeecb9cc6d61a2608aa506cf0392b3714f +size 121253696 diff --git a/flutter/lib/channels/vpn_manager.dart b/flutter/lib/channels/vpn_manager.dart index ccc558c..8591939 100644 --- a/flutter/lib/channels/vpn_manager.dart +++ b/flutter/lib/channels/vpn_manager.dart @@ -18,7 +18,7 @@ enum VpnStatus { class VpnManager { Future getStatus() async { // Native channel - const platform = MethodChannel("com.sail_tunnel.sail/vpn_manager"); + const platform = MethodChannel("com.vpntunnel.vpnzeus/vpn_manager"); if (Platform.isAndroid || Platform.isMacOS) { bool? result = await platform.invokeMethod("getStatus"); // print("${result}"); @@ -40,7 +40,7 @@ class VpnManager { Future getConnectedDate() async { // Native channel - const platform = MethodChannel("com.sail_tunnel.sail/vpn_manager"); + const platform = MethodChannel("com.vpntunnel.vpnzeus/vpn_manager"); double result; try { if (Platform.isAndroid || Platform.isMacOS) { @@ -58,7 +58,7 @@ class VpnManager { Future toggle() async { // Native channel - const platform = MethodChannel("com.sail_tunnel.sail/vpn_manager"); + const platform = MethodChannel("com.vpntunnel.vpnzeus/vpn_manager"); bool result = false; try { result = await platform.invokeMethod("toggle"); @@ -72,7 +72,7 @@ class VpnManager { Future getTunnelLog() async { // Native channel - const platform = MethodChannel("com.sail_tunnel.sail/vpn_manager"); + const platform = MethodChannel("com.vpntunnel.vpnzeus/vpn_manager"); String result; try { result = await platform.invokeMethod("getTunnelLog"); @@ -86,7 +86,7 @@ class VpnManager { Future getTunnelConfiguration() async { // Native channel - const platform = MethodChannel("com.sail_tunnel.sail/vpn_manager"); + const platform = MethodChannel("com.vpntunnel.vpnzeus/vpn_manager"); String result; try { result = await platform.invokeMethod("getTunnelConfiguration"); @@ -100,7 +100,7 @@ class VpnManager { Future setTunnelConfiguration(String conf) async { // Native channel - const platform = MethodChannel("com.sail_tunnel.sail/vpn_manager"); + const platform = MethodChannel("com.vpntunnel.vpnzeus/vpn_manager"); String result; try { result = await platform.invokeMethod("setTunnelConfiguration", conf);