优化初始化检测逻辑

(cherry picked from commit c38e2f02d113e93a20548045d07de3faddadedda)
This commit is contained in:
Rust 2025-10-31 18:19:40 +08:00 committed by speakeloudest
parent 442ea458b7
commit b716ba8294
3 changed files with 100 additions and 12 deletions

3
.gitignore vendored
View File

@ -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

View File

@ -56,10 +56,13 @@ class KRDomain {
// 🔧 P1修复
static const int kr_domainTimeout = 2; // 32
static const int kr_totalTimeout = 4; // 64
// 🔧 5
static const int kr_maxDomainSwitchTimeout = 10; //
static Set<String> _triedDomains = {}; //
static Map<String, int> _domainResponseTimes = {}; //
static Map<String, DateTime> _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<String?> 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<String?> _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<bool> 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);

View File

@ -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');