From 3b9b5b3cb0b1af6ceca497205212f3377438bde0 Mon Sep 17 00:00:00 2001 From: wgh19 Date: Wed, 15 May 2024 20:40:59 +0800 Subject: [PATCH] system proxy & build_windows script --- .../com/github/wgh136/pixes/MainActivity.kt | 26 +++++++++++++++- build_windows.py | 28 +++++++++++++++++ ios/Runner/AppDelegate.swift | 13 ++++++++ lib/network/app_dio.dart | 30 +++++++++++++++++-- macos/Runner/MainFlutterWindow.swift | 17 +++++++++++ macos/Runner/Release.entitlements | 6 ++++ 6 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 build_windows.py diff --git a/android/app/src/main/kotlin/com/github/wgh136/pixes/MainActivity.kt b/android/app/src/main/kotlin/com/github/wgh136/pixes/MainActivity.kt index b40c8d8..cbff28e 100644 --- a/android/app/src/main/kotlin/com/github/wgh136/pixes/MainActivity.kt +++ b/android/app/src/main/kotlin/com/github/wgh136/pixes/MainActivity.kt @@ -1,5 +1,29 @@ package com.github.wgh136.pixes import io.flutter.embedding.android.FlutterActivity +import io.flutter.plugins.GeneratedPluginRegistrant +import io.flutter.plugin.common.MethodChannel +import io.flutter.embedding.engine.FlutterEngine -class MainActivity: FlutterActivity() +class MainActivity: FlutterActivity() { + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine) + //获取http代理 + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + "pixes/proxy" + ).setMethodCallHandler { _, res -> + res.success(getProxy()) + } + } + + private fun getProxy(): String{ + val host = System.getProperty("http.proxyHost") + val port = System.getProperty("http.proxyPort") + return if(host!=null&&port!=null){ + "$host:$port" + }else{ + "No Proxy" + } + } +} \ No newline at end of file diff --git a/build_windows.py b/build_windows.py new file mode 100644 index 0000000..44f0938 --- /dev/null +++ b/build_windows.py @@ -0,0 +1,28 @@ +import subprocess +import os + +fontUse = ''' + fonts: + - family: font + fonts: + - asset: assets/SourceHanSansSC-Regular.otf +''' + +file = open('pubspec.yaml', 'r') +content = file.read() +file.close() +file = open('pubspec.yaml', 'a') +file.write(fontUse) +file.close() + +subprocess.run(["flutter", "build", "windows"], shell=True) + +file = open('pubspec.yaml', 'w') +file.write(content) + +if os.path.exists("build/app-windows.zip"): + os.remove("build/app-windows.zip") + +# 压缩build/windows/x64/runner/Release, 生成app-windows.zip, 使用tar命令 +subprocess.run(["tar", "-a", "-c", "-f", "build/app-windows.zip", "-C", "build/windows/x64/runner/Release", "."] + , shell=True) diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4..e90b632 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -7,6 +7,19 @@ import Flutter _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + let methodChannel = FlutterMethodChannel(name: "pixes/proxy", binaryMessenger: controller.binaryMessenger) + methodChannel.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in + if let proxySettings = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as NSDictionary?, + let dict = proxySettings.object(forKey: kCFNetworkProxiesHTTPProxy) as? NSDictionary, + let host = dict.object(forKey: kCFNetworkProxiesHTTPProxy) as? String, + let port = dict.object(forKey: kCFNetworkProxiesHTTPPort) as? Int { + let proxyConfig = "\(host):\(port)" + result(proxyConfig) + } else { + result("") + } + } + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/lib/network/app_dio.dart b/lib/network/app_dio.dart index 284dc45..f182798 100644 --- a/lib/network/app_dio.dart +++ b/lib/network/app_dio.dart @@ -2,7 +2,10 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:dio/io.dart'; +import 'package:flutter/services.dart'; +import 'package:pixes/foundation/app.dart'; import 'package:pixes/foundation/log.dart'; +import 'package:pixes/utils/ext.dart'; export 'package:dio/dio.dart'; @@ -121,13 +124,34 @@ class AppDio extends DioForNative { } void setSystemProxy() { - HttpOverrides.global = _ProxyHttpOverrides(); + HttpOverrides.global = _ProxyHttpOverrides() + ..findProxy(Uri()); } class _ProxyHttpOverrides extends HttpOverrides { + String proxy = "DIRECT"; + String findProxy(Uri uri) { - // TODO: proxy - return "DIRECT"; + if(!App.isLinux) { + var channel = const MethodChannel("pixes/proxy"); + channel.invokeMethod("getProxy").then((value) { + if(value == "No proxy"){ + proxy = "DIRECT"; + } else { + if(proxy.contains("https")){ + var proxies = value.split(";"); + for (String proxy in proxies) { + proxy = proxy.removeAllBlank; + if (proxy.startsWith('https=')) { + value = proxy.substring(6); + } + } + } + proxy = "PROXY $value"; + } + }); + } + return proxy; } @override diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index cb59c5e..92d59e5 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -1,5 +1,6 @@ import Cocoa import FlutterMacOS +import IOKit.ps class MainFlutterWindow: NSWindow { override func awakeFromNib() { @@ -8,6 +9,22 @@ class MainFlutterWindow: NSWindow { self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) + let proxyChannel = FlutterMethodChannel( + name: "pixes/proxy", + binaryMessenger: flutterViewController.engine.binaryMessenger) + proxyChannel.setMethodCallHandler { (call, result) in + // 获取代理设置 + if let proxySettings = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as NSDictionary?, + let dict = proxySettings.object(forKey: kCFNetworkProxiesHTTPProxy) as? NSDictionary, + let host = dict.object(forKey: kCFNetworkProxiesHTTPProxy) as? String, + let port = dict.object(forKey: kCFNetworkProxiesHTTPPort) as? Int { + let proxyConfig = "\(host):\(port)" + result(proxyConfig) + } else { + result("No proxy") + } + } + RegisterGeneratedPlugins(registry: flutterViewController) super.awakeFromNib() diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 852fa1a..26ac461 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -4,5 +4,11 @@ com.apple.security.app-sandbox + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.network.server +