diff --git a/.gitignore b/.gitignore index 1bb2667..1c1a451 100755 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,6 @@ scripts/*.json !scripts/build_config.template.json scripts/*.bak lib/app/common/app_config.dart.bak +# 版本号递增日志 +build_versions.log +pubspec.yaml.version_bak diff --git a/lib/app/common/app_config.dart b/lib/app/common/app_config.dart index 2d5fa78..0f5ac79 100755 --- a/lib/app/common/app_config.dart +++ b/lib/app/common/app_config.dart @@ -56,10 +56,13 @@ class KRDomain { // 🔧 P1修复:减少域名检测超时时间 static const int kr_domainTimeout = 2; // 域名检测超时时间(秒)3→2 static const int kr_totalTimeout = 4; // 总体超时时间(秒)6→4 + // 🔧 修复5:域名检测总超时时间(防止多层检测累加) + static const int kr_maxDomainSwitchTimeout = 10; // 域名切换最大总超时(秒) static Set _triedDomains = {}; // 已尝试过的域名集合 static Map _domainResponseTimes = {}; // 域名响应时间记录 static Map _domainLastCheck = {}; // 域名最后检测时间 - static const int _domainCacheDuration = 300; // 域名缓存时间(秒) + // 🔧 修复6:增加缓存时长 300秒(5分钟) → 600秒(10分钟) + static const int _domainCacheDuration = 600; // 域名缓存时间(秒) // Dio 实例及初始化 static final Dio _dio = (() { @@ -88,6 +91,32 @@ class KRDomain { /// WebSocket 域名 static String get kr_ws => "$kr_currentDomain/v1/app"; + /// 🔧 修复1:应用启动时清理静态状态 + /// 清理域名检测的所有静态状态,避免旧数据影响新的启动流程 + static void kr_resetDomainState() { + KRLogUtil.kr_i('🧹 清理域名检测静态状态', tag: 'KRDomain'); + + // 清空已尝试的域名集合 + _triedDomains.clear(); + + // 清空响应时间记录 + _domainResponseTimes.clear(); + + // 清空最后检测时间(保留最近成功的域名缓存) + // 只清理超过缓存时长的记录 + final now = DateTime.now(); + _domainLastCheck.removeWhere((domain, lastCheck) { + final age = now.difference(lastCheck).inSeconds; + return age > _domainCacheDuration; + }); + + // 取消重试定时器 + _retryTimer?.cancel(); + _retryTimer = null; + + KRLogUtil.kr_i('✅ 域名状态已清理', tag: 'KRDomain'); + } + /// 从URL中提取域名 static String kr_extractDomain(String url) { try { @@ -192,10 +221,11 @@ class KRDomain { if (lastCheck != null) { final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds; if (timeSinceLastCheck < _domainCacheDuration) { + // 🔧 修复2:放宽缓存阈值 5000ms → 10000ms // 使用缓存的响应时间判断域名是否可用 final responseTime = _domainResponseTimes[domain]; - if (responseTime != null && responseTime < 5000) { // 5秒内响应认为可用 - KRLogUtil.kr_i('📋 使用缓存结果,域名 $domain 可用(缓存时间: ${timeSinceLastCheck}s)', tag: 'KRDomain'); + if (responseTime != null && responseTime < 10000) { // 10秒内响应认为可用 + KRLogUtil.kr_i('📋 使用缓存结果,域名 $domain 可用(缓存时间: ${timeSinceLastCheck}s,响应时间: ${responseTime}ms)', tag: 'KRDomain'); return true; } } @@ -270,9 +300,27 @@ class KRDomain { /// 快速域名切换 - 并发检测所有域名 static Future kr_fastDomainSwitch() async { if (kr_baseDomains.isEmpty) return null; - + KRLogUtil.kr_i('🚀 开始快速域名切换,检测 ${kr_baseDomains.length} 个主域名: $kr_baseDomains', tag: 'KRDomain'); final startTime = DateTime.now(); + + // 🔧 修复5:为整个域名切换流程添加总超时 + try { + return await _executeFastDomainSwitch(startTime).timeout( + Duration(seconds: kr_maxDomainSwitchTimeout), + onTimeout: () { + KRLogUtil.kr_e('⏰ 域名切换总超时(${kr_maxDomainSwitchTimeout}秒)', tag: 'KRDomain'); + return null; + }, + ); + } catch (e) { + KRLogUtil.kr_e('❌ 域名切换异常: $e', tag: 'KRDomain'); + return null; + } + } + + /// 执行快速域名切换的核心逻辑 + static Future _executeFastDomainSwitch(DateTime startTime) async { // 先检查缓存,如果有可用的域名直接返回 for (String domain in kr_baseDomains) { @@ -281,8 +329,9 @@ class KRDomain { final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds; if (timeSinceLastCheck < _domainCacheDuration) { final responseTime = _domainResponseTimes[domain]; - if (responseTime != null && responseTime < 2000) { // 降低缓存阈值 - KRLogUtil.kr_i('🎯 使用缓存结果快速切换,域名: $domain', tag: 'KRDomain'); + // 🔧 修复2:放宽缓存阈值 2000ms → 5000ms + if (responseTime != null && responseTime < 5000) { // 5秒内响应认为可用 + KRLogUtil.kr_i('🎯 使用缓存结果快速切换,域名: $domain (响应时间: ${responseTime}ms)', tag: 'KRDomain'); return domain; } } @@ -344,9 +393,19 @@ class KRDomain { return localBackupDomain; } - // 最后兜底方案 - KRLogUtil.kr_w('⚠️ 所有域名都失败,使用兜底域名', tag: 'KRDomain'); - return "api.omntech.com"; + // 🔧 修复4:验证兜底域名是否可用 + KRLogUtil.kr_w('⚠️ 所有域名都失败,尝试兜底域名', tag: 'KRDomain'); + const fallbackDomain = "api.maodag.top"; + + // 快速验证兜底域名 + bool isFallbackAvailable = await kr_fastCheckDomainAvailability(fallbackDomain); + if (isFallbackAvailable) { + KRLogUtil.kr_i('✅ 兜底域名可用: $fallbackDomain', tag: 'KRDomain'); + return fallbackDomain; + } + + KRLogUtil.kr_e('❌ 兜底域名也不可用: $fallbackDomain', tag: 'KRDomain'); + return null; // 所有域名都失败,返回 null } catch (e) { final endTime = DateTime.now(); @@ -765,13 +824,31 @@ class KRDomain { /// 切换到下一个域名 static Future kr_switchToNextDomain() async { if (kr_baseDomains.isEmpty) return false; - + KRLogUtil.kr_i('🔄 开始域名切换,当前域名: $kr_currentDomain', tag: 'KRDomain'); _triedDomains.add(kr_currentDomain); KRLogUtil.kr_i('📝 已尝试域名: $_triedDomains', tag: 'KRDomain'); - + + // 🔧 修复3:优先使用最后一次成功的域名(缓存) + // 如果缓存中有最近成功的域名,优先使用它 + if (_triedDomains.isEmpty || _triedDomains.length == 1) { + for (String domain in kr_baseDomains) { + final lastCheck = _domainLastCheck[domain]; + final responseTime = _domainResponseTimes[domain]; + if (lastCheck != null && responseTime != null && responseTime < 5000) { + final age = DateTime.now().difference(lastCheck).inSeconds; + if (age < _domainCacheDuration && !_triedDomains.contains(domain)) { + kr_currentDomain = domain; + await kr_saveCurrentDomain(); + KRLogUtil.kr_i('✅ 使用缓存的成功域名: $kr_currentDomain (响应时间: ${responseTime}ms)', tag: 'KRDomain'); + return true; + } + } + } + } + // 检查是否有预检测成功的域名可以直接使用 - if (kr_baseDomains.contains(kr_currentDomain) && + if (kr_baseDomains.contains(kr_currentDomain) && !_triedDomains.contains(kr_currentDomain)) { KRLogUtil.kr_i('✅ 使用预检测成功的域名: $kr_currentDomain', tag: 'KRDomain'); return true; @@ -1137,6 +1214,10 @@ class AppConfig { _isInitializing = true; try { + // 🔧 修复6:启动时优先加载上次成功的域名 + await KRDomain.kr_loadBaseDomain(); + KRLogUtil.kr_i('📍 当前使用域名: ${KRDomain.kr_currentDomain}', tag: 'AppConfig'); + // 所有模式都走正常的配置请求流程 KRLogUtil.kr_i('🚀 开始配置初始化', tag: 'AppConfig'); await _startAutoRetry(onSuccess); diff --git a/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart b/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart index 8242d17..e626db1 100755 --- a/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart +++ b/lib/app/modules/kr_splash/controllers/kr_splash_controller.dart @@ -68,6 +68,10 @@ class KRSplashController extends GetxController { KRLogUtil.kr_i('[SPLASH_TIMING] 🎬 启动页控制器 onInit', tag: 'SplashController'); KRLogUtil.kr_i('[SPLASH_TIMING] ═══════════════════════════════════════', tag: 'SplashController'); + // 🔧 修复1:应用启动时清理域名检测静态状态 + print('🧹 清理域名检测状态...'); + KRDomain.kr_resetDomainState(); + // 🔧 P2优化:网站配置和设备登录在后台执行,不阻塞主流程 print('🌐 启动后台任务:网站配置加载...'); KRLogUtil.kr_i('🌐 后台任务:网站配置和设备登录', tag: 'SplashController');