alroyso 1 년 전
부모
커밋
cc9cbe74f2

+ 8 - 6
lib/app/const/const.dart

@@ -1,6 +1,9 @@
 import 'dart:io';
 import 'package:path/path.dart' as path;
 import 'package:process_run/shell_run.dart';
+import 'package:device_info_plus/device_info_plus.dart';
+
+var arch = "amd64";
 
 class ClashName {
   static String get platform {
@@ -9,10 +12,9 @@ class ClashName {
     if (Platform.isLinux) return 'linux';
     return 'unknown';
   }
-
-  static String get arch {
-    return const String.fromEnvironment('OS_ARCH', defaultValue: 'amd64'); //amd64
-  }
+  // static String get arch {
+  //   return  const String.fromEnvironment('OS_ARCH', defaultValue: "arm64"); //amd64
+  // }
 
   static String get ext {
     if (Platform.isWindows) return '.exe';
@@ -51,10 +53,10 @@ class Files {
   }
 
   static File get assetsClashService {
-    return File(path.join(Paths.assetsBin.path, 'ccore-service-${ClashName.platform}-${ClashName.arch}${ClashName.ext}'));
+    return File(path.join(Paths.assetsBin.path, 'ccore-service-${ClashName.platform}-$arch${ClashName.ext}'));
   }
   static File get assetsCCore {
-    return File(path.join(Paths.assetsBin.path, 'ccore-${ClashName.platform}-${ClashName.arch}${ClashName.ext}'));
+    return File(path.join(Paths.assetsBin.path, 'ccore-${ClashName.platform}-$arch${ClashName.ext}'));
   }
   static File get assetsCountryMmdb {
     return File(path.join(Paths.assetsDep.path, 'Country.mmdb'));

+ 11 - 6
lib/app/controller/GlobalController.dart

@@ -31,9 +31,11 @@ class GlobalController extends GetxController {
   var isLoading = false.obs;
   var errorMsg = ''.obs;
   var statusCode = 0.obs;
+  var selectMageNode = false.obs;
   var systemProxySwitchIng = false.obs;
   var tunProxySwitchIng = false.obs;
   bool allowStatusUpdate = false;
+
   final selectedNode = Rx<NodeMode?>(null);
   // 策略组
   var proxieGroups = <ProxieProxiesItem>[].obs;
@@ -74,7 +76,7 @@ class GlobalController extends GetxController {
     // init service
     // await controllers.service.startService();
     // if (controllers.service.serviceStatus.value != RunningState.running) return;
-    // await controllers.service.serviceModeSwitch(true);
+    //await controllers.service.serviceModeSwitch(true);
     // init clash core
 
     // await controllers.service.initClashCoreConfig();
@@ -167,7 +169,7 @@ class GlobalController extends GetxController {
         if (it.chains.contains(name)) controllers.core.fetchCloseConnections(it.id);
       }
     }catch (e) {
-      LogHelper().d(e.toString());
+      //LogHelper().d(e.toString());
     }
 
 
@@ -256,7 +258,7 @@ class GlobalController extends GetxController {
   }
 
   Future<void> updateDate() async {
-    LogHelper().d('controller.proxie.updateDate()');
+    //LogHelper().d('controller.proxie.updateDate()');
     try
     {
       await controllers.core.updateConfig();
@@ -270,11 +272,11 @@ class GlobalController extends GetxController {
       }
       for (final it in proxieProxies) {
         allProxies[it.name] = it;
-        LogHelper().d('controller.proxieProxies');
+        //LogHelper().d('controller.proxieProxies');
       }
       for (final it in proxieGroups) {
         allProxies[it.name] = it;
-        LogHelper().d('controller.proxieGroups');
+        //LogHelper().d('controller.proxieGroups');
       }
       proxieGroups.refresh();
       proxieProxies.refresh();
@@ -419,7 +421,10 @@ class GlobalController extends GetxController {
     await systemProxySwitch(false);
     await controllers.service.stopClashCore();
     await killProcess(path.basename(Files.assetsCCore.path));
-    await killProcess(path.basename(Files.assetsClashService.path));
+    if(!controllers.service.serviceMode.value){
+      await killProcess(path.basename(Files.assetsClashService.path));
+    }
+
   }
   Future<void> handleExit() async {
     await stopAllCore();

+ 3 - 3
lib/app/controller/config.dart

@@ -124,13 +124,13 @@ rules:
     if( Platform.isWindows){
       stack = "gvisor";
     }
-    var dnsPort = 1553;
+    var dnsPort = 53;
     if(clashCoreTunEnable.value == true)
     {
       dnsPort = 53;
     }
 
-    var dnsEnab = false;
+    var dnsEnab = true;
     if(clashCoreTunEnable.value == true){
       dnsEnab = true;
     }
@@ -165,7 +165,7 @@ find-process-mode: strict
 global-client-fingerprint: chrome
 
 dns:
-  enable: true
+  enable: $dnsEnab
   listen: :$dnsPort
   ipv6: true
   enhanced-mode: redir-host

+ 91 - 39
lib/app/controller/service.dart

@@ -86,7 +86,7 @@ class ServiceController extends GetxController {
       if(data.mode == 'service-mode'){
         serviceMode.value = true;
         controllers.global.updateMsg("服务模式");
-        await serviceModeSwitch(false);
+        //await serviceModeSwitch(false);
       }
 
     } catch (_) {
@@ -102,6 +102,12 @@ class ServiceController extends GetxController {
       await fixBinaryExecutePermissions(Files.assetsClashService);
       await fixBinaryExecutePermissions(Files.assetsClashCore);
     }
+    // bool isAvailable = await isPortAvailable(controllers.config.servicePort.value);
+    // if (!isAvailable) {
+    //   controllers.global.updateMsg("端口${controllers.config.servicePort.value}被占用,启动服务失败。");
+    //   serviceStatus.value = RunningState.error;
+    //   return; // 端口被占用,返回失败
+    // }
     try {
       final data = await fetchInfo();
       serviceMode.value = data.mode == 'service-mode';
@@ -237,11 +243,42 @@ class ServiceController extends GetxController {
       } catch (e) {
         BotToast.showText(text: e.toString());
       }
-      await startService();
-      await startClashCore();
+      if(open){
+        await startService();
+      }else{
+        serviceMode.value = false;
+      }
+      //await startClashCore();
+    }
+  Future<bool> isPortAvailable(int port) async {
+    try {
+      // 尝试绑定一个socket到指定的端口
+      var server = await ServerSocket.bind(InternetAddress.anyIPv4, port);
+      // 成功绑定后立即关闭
+      await server.close();
+      // 如果成功绑定并关闭了服务器,那么端口是可用的
+      return true;
+    } on SocketException {
+      // 如果绑定失败,端口被占用
+      return false;
     }
+  }
+    Future<bool> startClashCore() async {
+      final timeout = const Duration(seconds: 30); // 设置超时时间为30秒
+      final checkInterval = const Duration(milliseconds: 200);
+      var startTime = DateTime.now();
+      await controllers.config.readClashCoreApi();
+      // bool isAvailable = await isPortAvailable(controllers.config.mixedPort.value);
+      // if (!isAvailable) {
+      //   controllers.global.updateMsg("端口 被占用,启动内核失败,等待几秒后重新测试。");
+      //   return false; // 端口被占用,返回失败
+      // }
+      // isAvailable = await isPortAvailable(controllers.config.ApiAddressPort.value);
+      // if (!isAvailable) {
+      //   controllers.global.updateMsg("端口 被占用,启动内核失败,等待几秒后重新测试。");
+      //   return false; // 端口被占用,返回失败
+      // }
 
-    Future<void> startClashCore() async {
       try {
         controllers.global.updateMsg("启动内核---${controllers.config.config.value.selected}");
         if( controllers.config.config.value.selected == 'init_proxy.yaml'){
@@ -250,55 +287,70 @@ class ServiceController extends GetxController {
           controllers.global.updateMsg("启动内核");
         }
         coreStatus.value = RunningState.starting;
-        int? exitCode;
-        clashCoreProcess = await Process.start(Files.assetsCCore.path, ['-d', Paths.config.path, '-f', path.join(Paths.config.path, controllers.config.config.value.selected)], mode: ProcessStartMode.inheritStdio);
-        clashCoreProcess!.exitCode.then((code) => exitCode = code);
 
-        //await fetchStart(controllers.config.config.value.selected);
-        log.debug("api${controllers.config.clashCoreApiAddress.value}");
-        controllers.core.setApi(controllers.config.clashCoreApiAddress.value, controllers.config.clashCoreApiSecret.value);
-        if (exitCode != null)
+        if(serviceMode.value == true){
+          await fetchStart(controllers.config.config.value.selected);
+        }
+        else
         {
-            controllers.global.updateMsg("启动内核错误");
-            return;
+          int? exitCode;
+          clashCoreProcess = await Process.start(Files.assetsCCore.path, ['-d', Paths.config.path, '-f', path.join(Paths.config.path, controllers.config.config.value.selected)], mode: ProcessStartMode.inheritStdio);
+          clashCoreProcess!.exitCode.then((code) => exitCode = code);
+          if (exitCode != null && exitCode != 0) {
+            // 非零退出代码通常表示错误
+            controllers.global.updateMsg("启动内核错误,请重启点电脑测试");
+            return false;
+          }
         }
-        while (true) {
-          log.debug("等待内核请动...");
-          await Future.delayed(const Duration(milliseconds: 200));
+
+        //
+        log.debug("api${controllers.config.clashCoreApiAddress.value}");
+        controllers.core.setApi(controllers.config.clashCoreApiAddress.value, controllers.config.clashCoreApiSecret.value);
+
+        while (DateTime.now().difference(startTime) < timeout) {
           try {
+            controllers.global.updateMsg("等待内核启动..");
             final ret = await controllers.core.fetchHello();
-            log.debug("请求内核结果$ret...");
-            // controllers.global.updateMsg("请求内核结果$ret---服务器状态${info.status}...");
+            // 如果fetchHello成功,跳出循环
             break;
           } catch (_) {
-            //controllers.global.updateMsg("请求内核错误${e.toString()}---服务器状态${info.status}...");
+            // 如果fetchHello失败,等待200毫秒后重试
+            await Future.delayed(checkInterval);
           }
         }
+
+        // 检查是否超时
+        if (DateTime.now().difference(startTime) >= timeout) {
+          // 如果超时,更新状态并抛出异常
+          coreStatus.value = RunningState.error;
+          controllers.global.updateMsg("内核启动超时,重新点击加速后尝试。");
+          return false; // 提前退出函数
+        }
         await controllers.core.updateConfig();
-        // if (Platform.isMacOS &&
-        //     controllers.service.serviceMode.value &&
-        //     controllers.config.clashCoreTunEnable.value &&
-        //     controllers.config.clashCoreDns.isNotEmpty) {
-        //   await MacSystemDns.instance.set([controllers.config.clashCoreDns.value]);
-        // }
-        // if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(controllers.core.proxyConfig);
         coreStatus.value = RunningState.running;
         controllers.global.updateMsg("内核状态:${coreStatus.value == RunningState.running} ");
         controllers.global.updateDate();
+        return true;
       } catch (e) {
         log.error("core -- $e");
         controllers.global.updateMsg("启动内核错误");
         //controllers.global.handleApiError(e);
        // BotToast.showText(text: e.toString());
         coreStatus.value = RunningState.error;
+        return false;
       }
     }
 
     Future<void> stopClashCore() async {
       coreStatus.value = RunningState.stopping;
       await controllers.global.closeProxy();
-      if(clashCoreProcess != null){
-        clashCoreProcess?.kill();
+      if(serviceMode.value == true){
+        await fetchStop();
+      }
+      else{
+        if(clashCoreProcess != null){
+          clashCoreProcess?.kill();
+        }
       }
 
       // killProcess(ClashName.name);
@@ -310,7 +362,7 @@ class ServiceController extends GetxController {
       // }
       //if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(SystemProxyConfig());
       //await stopClash();
-      //await fetchStop();
+
       coreStatus.value = RunningState.stoped;
     }
     Future<void> initClashCoreConfig() async {
@@ -347,16 +399,16 @@ class ServiceController extends GetxController {
       //   controllers.global.updateMsg("fetchReloadConfig${controllers.config.clashCoreApiAddress.value}...");
       // }
       //BotToast.showText(text: '正在重启 Core ……');
-      // controllers.global.updateMsg("停止内核...");
-      // await stopClashCore();
-      // await controllers.config.readClashCoreApi();
-      // await startClashCore();
-      // if (coreStatus.value == RunningState.error) {
-      //   controllers.global.updateMsg("启动内核失败...");
-      // } else {
-      //   await controllers.core.updateVersion();
-      //   controllers.global.updateMsg("启动内核成功...");
-      // }
+      controllers.global.updateMsg("停止内核...");
+      await stopClashCore();
+      await controllers.config.readClashCoreApi();
+      await startClashCore();
+      if (coreStatus.value == RunningState.error) {
+        controllers.global.updateMsg("启动内核失败...");
+      } else {
+        await controllers.core.updateVersion();
+        controllers.global.updateMsg("启动内核成功...");
+      }
     }
 
   Future<int> getFreePort() async {

+ 7 - 0
lib/app/i18n/i18n.dart

@@ -25,6 +25,10 @@ class I18n extends Translations {
           "tray_copy_command_line_proxy": "Copy command line proxy",
           "tray_about": "About",
           "tray_exit": "Exit",
+          //node
+          "node_tit" : "Mouse wheel slide down select node",
+          "node_auto" : "Automatic recommend",
+
           // modal
           "model_ok": "Ok",
           "model_cancel": "Cancel",
@@ -141,6 +145,9 @@ class I18n extends Translations {
           "tray_copy_command_line_proxy": "复制命令行代理",
           "tray_about": "关于",
           "tray_exit": "退出",
+          //node
+          "node_tit" : "鼠标滚轮下滑选择节点",
+          "node_auto" : "自动推荐",
           // modal
           "model_ok": "确 定",
           "model_cancel": "取 消",

+ 39 - 24
lib/app/modules/home/controllers/home_controller.dart

@@ -38,6 +38,7 @@ class HomeController extends GetxController {
   var coreStuatus = false.obs;
   var connectStatus = Rx<ConnectionStatus>(ConnectionStatus.disconnected);
   var nodeModes = <NodeMode>[];
+  var isConnect = false.obs;
   bool get isRunning => connectStatus.value == ConnectionStatus.stopped && controllers.global.allowStatusUpdate;
   late final GlobalController globalController = controllers.global;
   StreamSubscription<RunningState>? _statusSubscription;
@@ -68,10 +69,10 @@ class HomeController extends GetxController {
     final coreStatus = controllers.service.coreStatus.value;
     final isVisible = controllers.window.isVisible.value;
     final serviceStatus =  controllers.service.serviceStatus.value;
-    if(serviceStatus != RunningState.running){
-      updateStatus(ConnectionStatus.disconnected);
-      return;
-    }
+    // if(serviceStatus != RunningState.running){
+    //   updateStatus(ConnectionStatus.disconnected);
+    //   return;
+    // }
     if (coreStatus == RunningState.running && isVisible &&  controllers.global.allowStatusUpdate) {
       // if(connectStatus.value == ConnectionStatus.connecting){
       //   controllers.global.updateMsg("连接完成...");
@@ -133,7 +134,11 @@ class HomeController extends GetxController {
           await controllers.service.reloadClashCore();
         }
         else{
-          await controllers.service.startClashCore();
+          final ret = await controllers.service.startClashCore();
+          if(ret == false){
+            //controllers.global.updateMsg("启动内核失败...");
+            return;
+          }
         }
 
       } else {
@@ -149,27 +154,33 @@ class HomeController extends GetxController {
         else{
           controllers.global.updateMsg("正在启动内核...");
 
-          await controllers.service.startClashCore();
+          final ret = await controllers.service.startClashCore();
+          if(ret == false){
+            //controllers.global.updateMsg("启动内核失败...");
+            return;
+          }
         }
 
       }
 
       updateStatus(ConnectionStatus.connecting);
-      Future.delayed(const Duration(seconds: 3), () async {
-        updateStatus(ConnectionStatus.stopped);
-        await controllers.global.updateDate();
-        await controllers.global.updateNode();
-        //
-        await controllers.tray.updateTray();
+      updateStatus(ConnectionStatus.stopped);
+      await controllers.global.updateDate();
+      await controllers.global.updateNode();
+      //
+      await controllers.tray.updateTray();
 
-        if(routeModes == "tun"){
-
-        }
-        else{
-          await controllers.global.systemProxySwitch(true);
-          controllers.global.updateMsg("设置系统代理完成...");
-        }
-      });
+      if(routeModes == "tun"){
+        controllers.global.updateMsg("启动tun模式完成...");
+      }
+      else{
+        await controllers.global.systemProxySwitch(true);
+        controllers.global.updateMsg("设置系统代理完成...");
+      }
+      isConnect.value = true;
+      // Future.delayed(const Duration(seconds: 3), () async {
+      //
+      // });
 
     }
   }
@@ -187,12 +198,12 @@ class HomeController extends GetxController {
     await controllers.global.systemProxySwitch(false);
     await controllers.config.setBreakConnections(true);
     await controllers.tray.updateTray();
-
     // // 停止服务
     await controllers.service.stopClashCore();
-    controllers.global.updateMsg("正在停止.等待3秒防止端口无法释放");
-    Future.delayed(const Duration(seconds: 3), () async {
+    controllers.global.updateMsg("正在停止.等待5秒防止端口无法释放");
+    Future.delayed(const Duration(seconds: 5), () async {
       controllers.global.allowStatusUpdate = false;
+      isConnect.value = false;
       updateStatus(ConnectionStatus.disconnected);
       controllers.global.updateMsg("停止完成,点击立即加速");
     });
@@ -226,9 +237,13 @@ class HomeController extends GetxController {
         controllers.global.updateMsg("当前连接状态未停止,不要多次启动...");
         return;
       }
+      if(isConnect.value == true){
+        controllers.global.updateMsg("当前连接状态未停止,不要多次启动...");
+        return;
+      }
       controllers.global.updateMsg("正在身份验证...");
       final ret  = await ApiService().fetchAuthUser(KAuthUser);
-      if(controllers.global.selectedNode.value == null){
+      if(controllers.global.selectMageNode.value == false){
         controllers.global.selectedNode.value = ret;
         controllers.global.selectNode(ret);
         controllers.global.updateMsg("获取自动节点完成...");

+ 1 - 1
lib/app/modules/home/views/home_view.dart

@@ -135,7 +135,7 @@ class HomeView extends GetView<HomeController> {
                 ),
                 ConnectionWidget(
                   status: controller.connectStatus.value, onTap: () {
-                  if(controller.isRunning){
+                  if(controller.isConnect.value){
                     controller.stopVpn();
                   } else
                   {

+ 3 - 1
lib/app/modules/node/controllers/node_controller.dart

@@ -67,6 +67,7 @@ class NodeController extends GetxController {
 
 
   void selectNode(NodeMode node) {
+    controllers.global.selectMageNode.value = true;
     controllers.global.selectedNode.value = node;
     _storeSelectedNode(node);
     controllers.global.swift(node.name!);
@@ -109,6 +110,7 @@ class NodeController extends GetxController {
   }
 
   void filterNodesWithLeastUsersInHK() {
+    controllers.global.selectMageNode.value = false;
     displayStrategy.value = NodeDisplayStrategy.LeastUsers;
     updateNodesToDisplay();
   }
@@ -146,7 +148,7 @@ class NodeController extends GetxController {
           // Handle the case where no nodes match the criteria. Maybe display a message or use a fallback.
           nodes = []; // Empty list or some fallback
         }
-
+        controllers.global.selectMageNode.value = false;
         break;
       case NodeDisplayStrategy.SelectedFirst:
 

+ 5 - 4
lib/app/modules/node/views/node_view.dart

@@ -5,7 +5,7 @@ import 'package:naiyouwl/app/controller/controllers.dart';
 
 import '../../../component/sys_app_bar.dart';
 import '../controllers/node_controller.dart';
-
+import 'package:naiyouwl/app/utils/utils.dart';
 class NodeView extends GetView<NodeController> {
   const NodeView({Key? key}) : super(key: key);
 
@@ -70,16 +70,17 @@ class NodeView extends GetView<NodeController> {
                   }),
                   Padding(
                     padding: const EdgeInsets.fromLTRB(0, 0, 0, 10),
-                    child: Row(
+                    child: Column(
                       mainAxisAlignment: MainAxisAlignment.spaceAround,
                       children: [
                         ElevatedButton(
                           onPressed: () => controller.filterNodesWithLeastUsersInHK(),
-                          child: const Text("自动推荐"),
+                          child:  Text('node_auto'.tr),
                         ),
+                        const SizedBox(height: 10,),
                         ElevatedButton(
                           onPressed: () => controller.showAllNodes(),
-                          child: const Text("显示所有节点"),
+                          child:  Text('node_tit'.tr),
                         ),
                         // ElevatedButton(
                         //   onPressed: () => controller.showSelectedFirst(),

+ 8 - 1
lib/main.dart

@@ -20,8 +20,10 @@ import 'package:naiyouwl/app/controller/tray.dart';
 import 'package:naiyouwl/app/controller/window.dart';
 import 'package:proxy_manager/proxy_manager.dart';
 import 'package:window_manager/window_manager.dart';
+import 'package:device_info_plus/device_info_plus.dart';
 
 
+import 'app/const/const.dart';
 import 'app/routes/app_pages.dart';
 import 'main.mapper.g.dart' show initializeJsonMapper;
 
@@ -46,7 +48,12 @@ void main() async {
   }));
 
 
-
+  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
+  if (Platform.isMacOS) {
+    MacOsDeviceInfo macInfo = await deviceInfo.macOsInfo;
+    print('macOS 架构: ${macInfo.arch}');
+    arch = macInfo.arch;
+  }
 
 
   Get.put(TrayController());

+ 2 - 0
macos/Flutter/GeneratedPluginRegistrant.swift

@@ -6,6 +6,7 @@ import FlutterMacOS
 import Foundation
 
 import connectivity_plus_macos
+import device_info_plus
 import file_selector_macos
 import flutter_secure_storage_macos
 import path_provider_foundation
@@ -20,6 +21,7 @@ import window_manager
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
   ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
+  DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
   FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
   FlutterSecureStorageMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageMacosPlugin"))
   PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))

+ 6 - 0
macos/Podfile.lock

@@ -2,6 +2,8 @@ PODS:
   - connectivity_plus_macos (0.0.1):
     - FlutterMacOS
     - ReachabilitySwift
+  - device_info_plus (0.0.1):
+    - FlutterMacOS
   - file_selector_macos (0.0.1):
     - FlutterMacOS
   - flutter_secure_storage_macos (3.3.1):
@@ -35,6 +37,7 @@ PODS:
 
 DEPENDENCIES:
   - connectivity_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos`)
+  - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
   - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`)
   - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
   - FlutterMacOS (from `Flutter/ephemeral`)
@@ -56,6 +59,8 @@ SPEC REPOS:
 EXTERNAL SOURCES:
   connectivity_plus_macos:
     :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos
+  device_info_plus:
+    :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
   file_selector_macos:
     :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos
   flutter_secure_storage_macos:
@@ -83,6 +88,7 @@ EXTERNAL SOURCES:
 
 SPEC CHECKSUMS:
   connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308
+  device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
   file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9
   flutter_secure_storage_macos: 6ceee8fbc7f484553ad17f79361b556259df89aa
   FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24

+ 1 - 0
pubspec.yaml

@@ -35,6 +35,7 @@ dependencies:
   kommon: ^0.4.1
   bot_toast: ^4.1.3
   protocol_handler: ^0.1.2
+  device_info_plus: ^9.1.0
 
 dev_dependencies:
 

+ 5 - 4
scripts/init.dart

@@ -4,6 +4,7 @@ import 'dart:io';
 import 'package:dio/dio.dart';
 import 'package:archive/archive.dart';
 import 'package:naiyouwl/app/const/const.dart';
+import 'package:naiyouwl/app/const/const.dart';
 import 'package:path/path.dart' as path;
 
 final dio = Dio();
@@ -15,7 +16,7 @@ final depDir = Directory(path.join(assetsPath, 'dep'));
 
 Future downloadLatestClashCore() async {
   const version = "v1.16.0";
-  final String clashCoreName = 'clash.meta-${ClashName.platform}-${ClashName.arch}-cgo-$version';
+  final String clashCoreName = 'clash.meta-${ClashName.platform}-$arch-cgo-$version';
 
 // Fetching release info from the GitHub API
   final info = await dio.get('https://api.github.com/repos/MetaCubeX/Clash.Meta/releases/tags/$version');
@@ -49,7 +50,7 @@ Future downloadLatestClashCore() async {
 Future<void> downloadAndUnarchiveService() async {
  // const String token = "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"; // 请确保不在公共代码中硬编码这个token
 
-  final serviceName = 'ccore-service-${ClashName.platform}-${ClashName.arch}';
+  final serviceName = 'ccore-service-${ClashName.platform}-$arch';
   // "name" -> "ccore-service-darwin-amd64-v1.0.0.gz"
   //final newSericeName = "$serviceName-v1.0.0.gz";
   // 获取GitHub release信息
@@ -91,7 +92,7 @@ Future<void> downloadAndUnarchiveService() async {
 }
 
 Future downloadLatestClashService() async {
-    final String serviceName = 'ccore-service-${ClashName.platform}-${ClashName.arch}';
+    final String serviceName = 'ccore-service-${ClashName.platform}-$arch';
   // // final info = await dio.get('https://api.github.com/repos/alroyso/clash-for-flutter-service/releases/latest');
   // // final Map<String, dynamic> latest = (info.data['assets'] as List<dynamic>).firstWhere((it) => (it['name'] as String).contains(serviceName));
   // //https://github.com/alroyso/clash-for-flutter-service/releases/download/untagged-8273cca760b55d0725ab/naiyou-service-darwin-arm64-v1.0.1.gz
@@ -144,7 +145,7 @@ Future downloadWintun() async {
   print('Download Success');
   print('Unarchiving wintun.zip');
   final files = ZipDecoder().decodeBytes(await wintunFile.readAsBytes());
-  final file = files.firstWhere((it) => it.name == 'wintun/bin/${ClashName.arch}/wintun.dll');
+  final file = files.firstWhere((it) => it.name == 'wintun/bin/$arch/wintun.dll');
   await File(path.join(depDir.path, 'wintun.dll')).writeAsBytes(file.content);
   await wintunFile.delete();
   print('Unarchiv Success');