Kaynağa Gözat

fix: 测试jsbridge

lilu 3 ay önce
ebeveyn
işleme
14faf7aedb

+ 0 - 2
android/app/src/main/kotlin/app/xixi/nomo/XRayService.kt

@@ -385,8 +385,6 @@ class XRayService : VpnService() {
                 } catch (e: Exception) {
                     VLog.e(TAG, "发送计时更新消息失败", e)
                 }
-            } ?: run {
-                VLog.w(TAG, "replyMessenger为空,无法发送计时更新")
             }
         } catch (e: Exception) {
             VLog.e(TAG, "发送计时更新失败", e)

+ 0 - 0
assets/test_jsbridge.html → assets/html/test_jsbridge.html


+ 38 - 55
assets/md/privacy.md

@@ -1,101 +1,84 @@
 # Privacy Policy
 
-Last updated on 25 March 2025
+Last updated on: [Insert Date]
 
 ## Introduction
 
-By using FKey.Win, you agree to be bound by the terms and conditions hereinafter set forth and applicable laws and regulations. The terms and conditions herein shall take effect upon your use of FKey.Win. If you do not agree to any of the following terms and conditions, please stop using FKey.Win. All FKey.Win's contents are subject to protection under copyright and trademark laws or other relevant laws and regulations. In the event of any breach of the terms and conditions herein by you, your access to FKey.Win may be restricted without notice.
+By using NOMO VPN, you agree to be bound by the terms and conditions hereinafter set forth and applicable laws and regulations. The terms and conditions herein shall take effect upon your use of NOMO VPN. If you do not agree to any of the following terms and conditions, please stop using NOMO VPN immediately.
+
+NOMO VPN is committed to protecting your privacy. This Privacy Policy explains how we collect, use, and safeguard your information when you use our VPN application and services.
 
 ### 1. General Information
 
-In this Privacy Policy document, we will address the information collected and processed during website visits and the use of the software provided.
+In this Privacy Policy document, we address the information collected and processed during the use of the NOMO VPN application and related services.
 
-If you have questions or concerns about the use of your personal data, please contact us through social media or customer service channels. For privacy-specific inquiries, please contact us at [email protected].
+If you have questions or concerns about the use of your personal data, or for privacy-specific inquiries, please contact us at [email protected].
 
 This Privacy Policy applies globally, though specific provisions may vary to comply with local regulations in your jurisdiction.
 
-It is recommended to read this document in its entirety to ensure adequate knowledge and understanding, as it is divided into the following topics below.
-
 ### 2. About the Collected Data and Its Use
 
-To use our service, you must create an account on our website, granting access to the FKey.Win software available for download. FKey.Win employs the following data collection methods:
+NOMO VPN prioritizes user privacy. We follow a strict "No-Logs" policy regarding your online activities. We do not track, store, or share your browsing history, destination IPs, or DNS queries.
 
-1. **User data**: These are voluntarily provided during registration and usage of our services. Such information may include your email address and password for accessing the user panel and software. This data is retained for the duration of your account's existence.
+To operate our service effectively, we collect limited data as follows:
 
-2. **Technical Data**: We may record device identifiers, IP addresses, browser type, regional settings, and other technical metrics to analyze compatibility issues, search preferences, location, and other data to personalize the browsing experience, ensure compatibility and improve service quality. This data is retained for up to 90 days.
+1. **User Account Data**: If you choose to register an account, we collect your email address and password. This is used solely for account management and authentication.
 
-3. **Contact data usage**: The email address provided during registration may be used for communication purposes, including support messages and notifications. This information is retained for the duration of your account's existence.
+2. **Technical & Device Data**: We may collect non-identifiable technical information such as your device model, OS version, app version, and generic regional settings (e.g., country). This helps us analyze compatibility issues, fix bugs, and improve service stability. This data is retained for up to 90 days.
 
-4. **Usage Data**: We may collect anonymized data related to your use of FKey.Win, such as the games you play and how you interact with the service. This data is used solely to optimize the performance and functionality of FKey.Win and is retained for up to 180 days.
+3. **Service Usage Data**: We collect minimal, anonymized aggregated data regarding the use of our VPN servers, such as total bandwidth consumed and connection duration. **We do not associate this data with your specific browsing activity.** This data is used solely to optimize server load balancing and performance.
 
-5. **Network Data**: To provide game acceleration services, we may collect data related to your network connection, such as latency and bandwidth. This data is used to optimize routing and improve your gaming experience. This information is stored for up to 30 days.
+4. **Contact Data**: If you contact our support team, we will use your email address to communicate with you regarding your inquiry.
 
-As FKey.Win is provided free of charge, we do not collect payment details and do not currently offer paid subscriptions.
+**Payment Information**: As NOMO VPN is currently provided free of charge, we do not collect payment details or credit card information. We do not currently display third-party advertisements.
 
 ### 3. Data Security and Storage
 
-We implement technical and organizational measures to protect the data collected by FKey.Win. However, please note that no method of data transmission or storage is 100% secure.
-
-1. **Data Storage**: The data we collect is stored securely and retained only for as long as necessary to provide and improve our services, as specified in Section 2.
+We implement robust technical and organizational measures to protect the data collected by NOMO VPN.
 
-2. **Data Deletion**: Your personal data will be securely deleted if you notify us of your intention to do so. You can exercise your data deletion rights by contacting our support team via [email protected] to initiate the data deletion process. We will respond to your request within 30 days.
+1. **Data Storage**: The minimal data we collect is stored securely and retained only for as long as necessary to provide and improve our services.
+2. **Encryption**: All traffic between your device and our VPN servers is encrypted to protect your online activities from prying eyes.
+3. **Data Deletion**: You can request the deletion of your account and associated personal data by contacting our support team via [email protected]. We will respond to and process your request within 30 days.
 
 ### 4. Legal Bases for Data Processing
 
-The processing of personal data may be based on the following legal grounds:
+The processing of personal data is based on the following legal grounds:
 
-1. Your consent;
-2. Execution of the contract for service provision;
-3. Compliance with legal obligations;
-4. Legitimate interests of FKey.Win or third parties;
-5. Credit protection where applicable.
-
-For further inquiries about the legal basis for processing your data, contact us at [email protected].
+1. **Contractual Necessity**: To provide you with the VPN service and functionality.
+2. **Legitimate Interests**: To improve our application, ensure security, and prevent fraud.
+3. **Consent**: When you voluntarily provide information (e.g., contacting support).
+4. **Legal Compliance**: To comply with applicable legal obligations.
 
 ### 5. Data Sharing
 
-Automatically collected information is used to manage our website and services, including improving user experience, troubleshooting technical issues, ensuring data security, and optimizing content delivery.
-
-We may share personal data with the following recipients:
-
-1. **Legal Requirements**: If required by law, regulation, or legal process, we may disclose data to law enforcement agencies or other authorities.
+**We do not sell, rent, or trade your personal data to any third parties.**
 
-2. **Legal and Administrative Entities**: In case of legal disputes or administrative issues, data may be shared for evidentiary purposes, including with credit agencies for verification purposes.
+We may share limited data only in the following circumstances:
 
-3. **Regulatory and Governmental Bodies**: We may disclose your information to legal authorities, regulators, courts, or other third parties when required by law or necessary to protect the rights and interests of the user or third parties.
-
-4. **Service Providers**: We may share anonymized data with third-party service providers who assist us in delivering and improving FKey.Win. These providers are contractually obligated to protect your data and use it only for the purposes specified by us.
-
-We do not sell or rent your data to any third parties.
+1. **Service Providers**: We may share anonymized technical data with trusted third-party service providers who assist us in server hosting or infrastructure maintenance. They are contractually obligated to protect data.
+2. **Legal Requirements**: We may disclose information if required by law, court order, or governmental regulation. However, since we do not store user activity logs, we cannot provide information about your browsing history.
+3. **Business Transfers**: In the event of a merger, acquisition, or sale of assets, user information may be transferred as part of the transaction, subject to the same privacy commitments.
 
 ### 6. User Rights
 
 As a data subject, you have the right to:
 
-1. Confirm whether we are processing your personal data;
-2. Request access to your personal data;
-3. Request correction of inaccurate or incomplete personal data;
-4. Request deletion of your personal data under certain circumstances;
-5. Request restriction of processing of your personal data;
-6. Exercise data portability rights;
-7. Withdraw consent at any time (where processing is based on consent).
+1. Access the personal information we hold about you.
+2. Request correction of inaccurate information.
+3. Request deletion of your account and personal data.
+4. Withdraw consent where processing is based on consent.
+5. Lodge a complaint with a data protection authority.
 
-To exercise these rights, please contact our Support Team via support@fkey.win. We will respond to your request within 30 days. In certain cases, we may need to verify your identity before processing your request.
+To exercise these rights, please contact our Support Team via [email protected].
 
 ### 7. Minors' Data Protection
 
-FKey.Win does not knowingly collect personal information from individuals under the age of 16. If we become aware that we have inadvertently collected personal data from a minor under the age of 16, we will take steps to delete such information as soon as possible. If you believe we might have collected information from a minor, please contact us at [email protected].
-
-### 8. Region-Specific Provisions
-
-**For European Economic Area (EEA) Users**: In compliance with the General Data Protection Regulation (GDPR), we serve as the data controller for your personal information. You have the right to lodge a complaint with your local data protection authority if you have concerns about how we process your data.
-
-**For California Residents**: In accordance with the California Consumer Privacy Act (CCPA), you have specific rights regarding your personal information. These include the right to know what personal information we collect, the right to request deletion, and the right to opt-out of the sale of personal information (although we do not sell personal information).
+NOMO VPN does not knowingly collect personal information from individuals under the age of 16. If we become aware that we have inadvertently collected personal data from a minor, we will take steps to delete such information immediately.
 
-### 9. Updates and Amendments
+### 8. Updates and Amendments
 
-We may update this Privacy Policy from time to time to reflect changes in our services or legal requirements. Any updates will be posted on our official website or within the FKey.Win application. Your continued use of FKey.Win constitutes your acceptance of the updated terms.
+We may update this Privacy Policy to reflect changes in our services (such as the introduction of new features) or legal requirements. Any updates will be posted within the NOMO VPN application. Your continued use of NOMO VPN constitutes your acceptance of the updated policy.
 
-### 10. Contact Information
+### 9. Contact Information
 
-If you have any questions or concerns about this Privacy Policy or our data practices, please contact us at [email protected].
+If you have any questions about this Privacy Policy, please contact us at [email protected].

+ 37 - 65
assets/md/terms.md

@@ -1,108 +1,80 @@
 # Terms of Use Agreement
 
-Last updated on 25 March 2025
+Last updated on: [Insert Date]
 
-By using the services provided by FKey.Win, you agree to be bound by the terms and conditions hereinafter set forth, and agree to comply with applicable laws and regulations of relevant jurisdictions and international conventions. This Agreement shall take effect upon your use of FKey.Win. If you do not agree to any of the following terms and conditions, you must immediately cease using FKey.Win.
-
-All FKey.Win's contents are subject to protection under copyright and trademark laws or other relevant laws and regulations. In the event of any breach of this Agreement by you, your access to FKey.Win may be restricted without notice.
+By using the services provided by NOMO VPN ("Service"), you agree to be bound by the terms and conditions hereinafter set forth. This Agreement shall take effect upon your download, installation, or use of NOMO VPN. If you do not agree to any of the following terms, you must immediately uninstall and cease using NOMO VPN.
 
 ### 1. General Information
 
-This legally binding Agreement governs the access and use of FKey.Win services, which are designed to optimize latency and routing for online gaming.
-
-By using FKey.Win (service or website) you agree to be bound by these terms and conditions of use.
-
-Please note that it is the user's obligation and duty to comply with the local laws applicable to the use of the service offered here.
-
-After registering on our website, the user understands that he/she may occasionally receive marketing e-mails at the registered e-mail address at any time.
-
-You are prohibited from accessing FKey.Win if you do not agree to all provisions of this Agreement.
-
-FKey.Win is a game acceleration tool independently developed and operated by its creators.
-
-You are kindly requested to read this Terms of Use Agreement in full to ensure that you have a full and accurate understanding of it.
+This legally binding Agreement governs the access and use of NOMO VPN, a service designed to provide secure, encrypted internet connectivity and privacy protection.
 
-### 2. Prohibited Activities
+NOMO VPN allows users to route their data traffic through our servers to secure their connection and mask their IP address.
 
-The purpose of the service provided is to ensure the best connection route to the player and its use is limited to online games only. This means that it cannot be used for any other purposes that are not defined by way of exception.
+By using NOMO VPN, you agree to comply with all applicable local, state, national, and international laws and regulations.
 
-Prohibited activities include but are not limited to:
-1. Any malicious activities
-2. Misuse for purposes other than online gaming
-3. Downloading or distributing files
-4. Use as a proxy server for connection masquerading
-5. Any illegal activities or activities that violate the rights of others
+### 2. Allowable Use and Prohibited Activities
 
-It is not allowed to pass on your personal account information to third parties, as this will break the security we offer the user, just as it is forbidden to rent your registration in our service.
+NOMO VPN allows you to browse the internet securely and privately. However, you must use the Service responsibly.
 
-Your contract with FKey.Win will automatically terminate in case of violation of any of the restrictions.
+**Prohibited activities include but are not limited to:**
 
-We reserve the right to terminate your account at any time without notice or reason.
+1. **Illegal Activities**: Using the Service for any criminal or illegal activities, including but not limited to fraud, identity theft, or the distribution of child pornography.
+2. **Harmful Conduct**: Transmitting malware, viruses, worms, or any code of a destructive nature.
+3. **Network Abuse**: engaging in denial-of-service (DoS) attacks, port scanning, or spamming (sending unsolicited bulk emails).
+4. **Intellectual Property Violation**: Downloading or distributing copyrighted material in violation of applicable copyright laws.
+5. **Unauthorized Access**: Attempting to access, probe, or scan unauthorized systems or networks.
 
-### 3. Service Availability
+We reserve the right to terminate your account or restrict access to the Service immediately, without notice, if you violate these terms.
 
-FKey.Win is provided free of charge and does not currently offer paid subscriptions. We reserve the right to modify or discontinue the service at any time without prior notice.
+### 3. Service Availability and Billing
 
-We do not guarantee uninterrupted availability and may perform maintenance without prior notice.
+**Current Status**: NOMO VPN is currently provided free of charge. We do not currently display third-party ads.
 
-Upon service termination, all user rights granted herein will immediately cease.
+**Future Changes**: We reserve the right to introduce subscription fees, premium features, or advertisements in future versions of the Service. Any such changes will be communicated clearly to users.
 
-In the event of service discontinuation, we will make reasonable efforts to notify users through our website or registered email addresses, but are not obligated to do so.
+**Service Reliability**: While we strive to provide a reliable service, we do not guarantee uninterrupted availability. We may perform maintenance or updates that could temporarily affect connectivity.
 
 ### 4. Errors and Updates
 
-The information provided by FKey.Win (including website content and in-product notifications) may contain errors due to technical or typographical issues. We cannot guarantee that all information is entirely accurate, complete, or up-to-date. You agree that such errors, without affecting the core functionality of FKey.Win, may be corrected by us without prior notice.
-
-We may update the software periodically to address bugs, add features, or make other improvements. By using FKey.Win, you consent to receive such updates automatically.
+The NOMO VPN software and related information may contain technical errors or inaccuracies. We reserve the right to correct such errors and update the software to add features, fix bugs, or improve security without prior notice. By using NOMO VPN, you consent to receive such updates.
 
 ### 5. External Links
 
-FKey.Win may contain links to external websites or resources. We are not responsible for the accuracy, legality, or content of any external sites linked to our product. Providing links does not imply endorsement by us. If you choose to access external links, you do so at your own risk.
-
-### 6. Limitations of Liability
+NOMO VPN may contain links to external websites. We are not responsible for the content, privacy policies, or practices of any third-party websites. Accessing external links is at your own risk.
 
-We are not responsible for any loss or damage caused by the use of FKey.Win, including but not limited to:
+### 6. Disclaimers and Limitations of Liability
 
-1. Instability or insecurity of third-party services.
-2. Temporary interruptions or data loss resulting from network issues.
-3. Any consequences arising from the use of FKey.Win in violation of game publishers' terms of service.
-4. Any indirect, consequential, or incidental damages.
-5. Loss of profits, revenue, data, or business opportunities.
+NOMO VPN is provided on an "AS IS" and "AS AVAILABLE" basis without warranties of any kind, either express or implied.
 
-The service provided here requires a minimum and stable connection, and there may be variations with internet speeds below 1 MB (1 megabyte) and, mainly, in unstable internet technologies, such as 3G, Wireless, radio and dial-up.
+To the maximum extent permitted by applicable law, NOMO VPN and its operators shall not be liable for:
 
-FKey.Win shall not be held liable for any damages directly or indirectly caused by force majeure events, including without limitation natural catastrophes, government-mandated restrictions, material regulatory amendments, telecommunications system failures, and any other circumstances beyond our reasonable control.
+1. Any indirect, incidental, special, consequential, or punitive damages.
+2. Loss of data, profits, or business opportunities.
+3. Failures in connectivity or speed resulting from your internet service provider (ISP) or network environment.
+4. Any actions taken against you by third parties (e.g., copyright holders) due to your misuse of the Service.
 
-TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, FKey.Win's TOTAL LIABILITY SHALL BE LIMITED TO DISCONTINUING THE SERVICE.
+We do not control and are not responsible for the data you transmit or receive via the Service.
 
 ### 7. User Responsibilities
 
-It is your responsibility to use FKey.Win in a lawful and responsible manner. You agree to:
-
-1. Comply with all applicable laws, regulations, and industry standards governing online services, while understanding that we assist in optimizing latency and routing for online gaming, and you are responsible for adhering to all terms in this privacy policy and service terms.
-
-2. Accept full responsibility for any consequences arising from your use of FKey.Win, including but not limited to violations of game publishers' terms of service.
+You are responsible for:
 
-3. Maintain the security of your account credentials. It is the user's duty to keep his/her account protected, and the registration email address can only be modified once, as we guarantee account recovery by sending a confirmation email to the email address registered on our website. While we provide account recovery tools, ultimate responsibility for account security rests with the user.
-
-If you violate this Agreement, we reserve the right to restrict or terminate your access to FKey.Win without notice.
+1. Maintaining the confidentiality of your account credentials (if applicable).
+2. Ensuring that your use of the Service complies with the laws of your jurisdiction.
+3. Any activity that occurs under your account or device.
 
 ### 8. Privacy Policy
 
-FKey.Win collects and processes personal data as outlined in our Privacy Policy, which is incorporated into this Agreement by reference. By using FKey.Win, you consent to the data practices described in the Privacy Policy.
+Your use of NOMO VPN is also governed by our Privacy Policy, which outlines how we collect and process data. By using the Service, you consent to the practices described in the Privacy Policy.
 
 ### 9. Dispute Resolution
 
-Any disputes arising from or related to this Agreement shall be resolved through good-faith negotiations between the parties. If a resolution cannot be reached through negotiation, the dispute shall be submitted to the competent courts in the jurisdiction where FKey.Win's operators are headquartered.
-
-This Agreement shall be governed by and construed in accordance with the laws of the jurisdiction where FKey.Win's operators are headquartered, without regard to its conflict of law principles.
-
-### 10. Updates and Amendments to this Agreement
+Any disputes arising from this Agreement shall be resolved through good-faith negotiations. If a resolution cannot be reached, the dispute shall be submitted to the competent courts in the jurisdiction where NOMO VPN's operators are headquartered.
 
-We may update or amend this Agreement at any time without prior notice. Your continued use of FKey.Win constitutes your acceptance of the updated terms. If you do not agree to the updated terms, you must immediately cease using FKey.Win and any continued use constitutes explicit acceptance of the revised terms.
+### 10. Updates to this Agreement
 
-Material changes to the Agreement will be communicated through our website or directly to the email address associated with your account.
+We may update this Agreement from time to time. The most current version will always be available within the application or on our official website. Your continued use of NOMO VPN after any changes constitutes your acceptance of the new Terms.
 
 ### 11. Contact Information
 
-If you have any questions or concerns regarding this Agreement, please contact us at support@fkey.win.
+If you have any questions regarding this Agreement, please contact us at support@nomovpn.com.

+ 5 - 0
lib/app/api/core/api_core.dart

@@ -341,4 +341,9 @@ class ApiCore extends BaseApi {
   Future<ApiResult> providerLoginCheck(dynamic data) async {
     return post(ApiCorePaths.providerLoginCheck, data: data);
   }
+
+  /// 获取所有节点
+  Future<ApiResult> getLocations(dynamic data) async {
+    return post(ApiCorePaths.getLocations, data: data);
+  }
 }

+ 3 - 0
lib/app/api/core/api_core_paths.dart

@@ -75,4 +75,7 @@ class ApiCorePaths {
 
   /// 获取调度信息
   static const String getDispatchInfo = '$_ver/app/getNodes';
+
+  /// 获取所有节点
+  static const String getLocations = '$_ver/app/getLocations';
 }

+ 52 - 6
lib/app/controllers/api_controller.dart

@@ -435,7 +435,7 @@ class ApiController extends GetxService {
         } else {
           if (await NetworkHelper.instance.isNetworkAvailable()) {
             final url = await ApiDomains.instance.getNextRouterUrl();
-            log(TAG, 'Launch request failed for URL $url: $e');
+            log(TAG, 'getDispatchInfo request failed for URL $url: $e');
             if (url.isEmpty) {
               rethrow;
             }
@@ -446,7 +446,7 @@ class ApiController extends GetxService {
         }
       } catch (e) {
         final url = await ApiDomains.instance.getNextRouterUrl();
-        log(TAG, 'Launch request failed for URL $url: $e');
+        log(TAG, 'getDispatchInfo request failed for URL $url: $e');
         if (url.isEmpty) {
           rethrow;
         }
@@ -492,7 +492,7 @@ class ApiController extends GetxService {
         } else {
           if (await NetworkHelper.instance.isNetworkAvailable()) {
             final url = await ApiDomains.instance.getNextApiUrl();
-            log(TAG, 'Launch request failed for URL $url: $e');
+            log(TAG, 'Register request failed for URL $url: $e');
             if (url.isEmpty) {
               rethrow;
             }
@@ -503,7 +503,7 @@ class ApiController extends GetxService {
         }
       } catch (e) {
         final url = await ApiDomains.instance.getNextApiUrl();
-        log(TAG, 'Launch request failed for URL $url: $e');
+        log(TAG, 'Register request failed for URL $url: $e');
         if (url.isEmpty) {
           rethrow;
         }
@@ -549,7 +549,7 @@ class ApiController extends GetxService {
         } else {
           if (await NetworkHelper.instance.isNetworkAvailable()) {
             final url = await ApiDomains.instance.getNextApiUrl();
-            log(TAG, 'Launch request failed for URL $url: $e');
+            log(TAG, 'Login request failed for URL $url: $e');
             if (url.isEmpty) {
               rethrow;
             }
@@ -560,7 +560,7 @@ class ApiController extends GetxService {
         }
       } catch (e) {
         final url = await ApiDomains.instance.getNextApiUrl();
-        log(TAG, 'Launch request failed for URL $url: $e');
+        log(TAG, 'Login request failed for URL $url: $e');
         if (url.isEmpty) {
           rethrow;
         }
@@ -631,4 +631,50 @@ class ApiController extends GetxService {
       rethrow;
     }
   }
+
+  Future<Groups> getLocations() async {
+    while (true) {
+      try {
+        ApiCore().setbaseUrl(ApiDomains.instance.getApiUrl());
+        final request = fp.toJson();
+        final result = await ApiCore().getLocations(request);
+        if (!result.success) {
+          throw Failure(
+            code: result.errorCode ?? '',
+            message: result.errorMessage ?? '',
+          );
+        }
+        final groups = Groups.fromJson(result.data);
+        return groups;
+      } on ApiException catch (_) {
+        rethrow;
+      } on Failure catch (_) {
+        rethrow;
+      } on DioException catch (e) {
+        if (e.response?.statusCode == Errors.eRegionNotAvailable ||
+            e.response?.statusCode == Errors.eUserDisabled ||
+            e.response?.statusCode == Errors.eTokenExpired) {
+          rethrow;
+        } else {
+          if (await NetworkHelper.instance.isNetworkAvailable()) {
+            final url = await ApiDomains.instance.getNextApiUrl();
+            log(TAG, 'getLocations request failed for URL $url: $e');
+            if (url.isEmpty) {
+              rethrow;
+            }
+            ApiCore().setbaseUrl(url);
+          } else {
+            rethrow;
+          }
+        }
+      } catch (e) {
+        final url = await ApiDomains.instance.getNextApiUrl();
+        log(TAG, 'getLocations request failed for URL $url: $e');
+        if (url.isEmpty) {
+          rethrow;
+        }
+        ApiCore().setbaseUrl(url);
+      }
+    }
+  }
 }

+ 1 - 1
lib/app/dialog/all_dialog.dart

@@ -159,7 +159,7 @@ class AllDialog {
       message:
           "A newer version of the app is ready.\nThis update improves stability and performance, and fixes known issues.",
       buttonText: Strings.upgradeNow.tr,
-      cancelText: Strings.cancel.tr,
+      cancelText: hasForceUpdate ? null : Strings.cancel.tr,
       onCancel: () {
         Navigator.of(Get.context!).pop();
       },

+ 8 - 2
lib/app/modules/home/controllers/home_controller.dart

@@ -1,4 +1,5 @@
 import 'package:get/get.dart';
+import 'package:nomo/app/controllers/api_controller.dart';
 import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
 import '../../../../utils/awesome_notifications_helper.dart';
 import '../../../../utils/log/logger.dart';
@@ -10,6 +11,7 @@ import '../../../data/sp/ix_sp.dart';
 /// 主页控制器
 class HomeController extends BaseController {
   final coreController = Get.find<CoreController>();
+  final apiController = Get.find<ApiController>();
   final TAG = 'HomeController';
 
   final _refreshController = RefreshController(initialRefresh: false);
@@ -173,7 +175,11 @@ class HomeController extends BaseController {
   }
 
   void onRefresh() async {
-    await Future.delayed(Duration(milliseconds: 2000));
-    refreshController.refreshCompleted();
+    try {
+      await apiController.launch();
+      refreshController.refreshCompleted();
+    } catch (e) {
+      refreshController.refreshFailed();
+    }
   }
 }

+ 1 - 1
lib/app/modules/home/widgets/menu_list.dart

@@ -56,7 +56,7 @@ class MenuList extends StatelessWidget {
         iconColor: const Color(0xFF34C759),
         onTap: () {
           print('Support tapped');
-          AllDialog.showUpdate();
+          AllDialog.showUpdate(hasForceUpdate: true);
         },
       ),
       MenuItem(

+ 5 - 0
lib/app/modules/node/controllers/node_controller.dart

@@ -39,6 +39,11 @@ class NodeController extends GetxController {
     }
   }
 
+  void updateGroups(Groups? groups) {
+    this.groups = groups;
+    _updateTabList();
+  }
+
   /// 更新 Tab 列表
   void _updateTabList() {
     final tabs = <String>[];

+ 12 - 4
lib/app/modules/node/widgets/node_list.dart

@@ -7,7 +7,9 @@ import 'package:nomo/app/widgets/click_opacity.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/iconfont/iconfont.dart';
+import '../../../controllers/api_controller.dart';
 import '../../../data/models/launch/groups.dart';
 import '../../../widgets/country_icon.dart';
 import '../../home/controllers/home_controller.dart';
@@ -30,7 +32,8 @@ class _NodeListState extends State<NodeList>
   bool get wantKeepAlive => true;
 
   // 获取 Controller
-  NodeController get controller => Get.find<NodeController>();
+  final controller = Get.find<NodeController>();
+  final apiController = Get.find<ApiController>();
 
   /// 获取国家的展开状态
   bool _getExpandedState(String countryCode) {
@@ -49,8 +52,13 @@ class _NodeListState extends State<NodeList>
   );
 
   void _onRefresh() async {
-    await Future.delayed(Duration(milliseconds: 2000));
-    _refreshController.refreshCompleted();
+    try {
+      final groups = await apiController.getLocations();
+      controller.updateGroups(groups);
+      _refreshController.refreshCompleted();
+    } catch (e) {
+      _refreshController.refreshFailed();
+    }
   }
 
   @override
@@ -63,7 +71,7 @@ class _NodeListState extends State<NodeList>
     if (data == null || data.tags == null || data.list == null) {
       return Center(
         child: Text(
-          '暂无数据',
+          Strings.noData.tr,
           style: TextStyle(fontSize: 16.sp, color: Get.reactiveTheme.hintColor),
         ),
       );

+ 27 - 0
lib/app/modules/setting/views/setting_view.dart

@@ -36,6 +36,7 @@ class SettingView extends BaseView<SettingController> {
       slivers: [
         // Account Section
         _buildSectionHeader(Strings.account.tr),
+        _buildLoginSection(),
         _buildAccountSection(),
 
         // Network Section
@@ -73,6 +74,32 @@ class SettingView extends BaseView<SettingController> {
     );
   }
 
+  /// 构建登录分组
+  Widget _buildLoginSection() {
+    return SliverToBoxAdapter(
+      child: Container(
+        margin: EdgeInsets.only(left: 14.w, right: 14.w, bottom: 10.w),
+        decoration: BoxDecoration(
+          color: Get.reactiveTheme.highlightColor,
+          borderRadius: BorderRadius.circular(12.r),
+        ),
+        child: _buildSettingItem(
+          icon: IconFont.icon37,
+          iconColor: Get.reactiveTheme.shadowColor,
+          title: Strings.login.tr,
+          trailing: Icon(
+            IconFont.icon02,
+            size: 20.w,
+            color: Get.reactiveTheme.hintColor,
+          ),
+          onTap: () {
+            Get.toNamed(Routes.LOGIN);
+          },
+        ),
+      ),
+    );
+  }
+
   /// Account 分组
   Widget _buildAccountSection() {
     return SliverToBoxAdapter(

+ 1 - 1
lib/utils/system_helper.dart

@@ -178,7 +178,7 @@ class SystemHelper {
       Routes.WEB,
       arguments: {
         // 使用 assets/ 前缀,WebView 会自动使用 loadData 加载
-        'url': 'assets/test_jsbridge.html',
+        'url': 'assets/html/test_jsbridge.html',
         'title': 'JS Bridge 测试',
         'fullScreen': true,
       },

+ 2 - 0
pubspec.yaml

@@ -117,6 +117,7 @@ flutter:
   assets:
     - assets/images/
     - assets/images/streaming/
+    - assets/images/html/
     - assets/vectors/
     - assets/vectors/boost/
     - assets/vectors/status/
@@ -125,6 +126,7 @@ flutter:
     - assets/lottie/
     - assets/flags/
     - assets/
+    - assets/html/
     - assets/md/
   fonts:
     - family: FiraSans