优化初始化检测逻辑
(cherry picked from commit c38e2f02d113e93a20548045d07de3faddadedda)
This commit is contained in:
parent
442ea458b7
commit
b716ba8294
3
.gitignore
vendored
3
.gitignore
vendored
@ -106,3 +106,6 @@ scripts/*.json
|
|||||||
!scripts/build_config.template.json
|
!scripts/build_config.template.json
|
||||||
scripts/*.bak
|
scripts/*.bak
|
||||||
lib/app/common/app_config.dart.bak
|
lib/app/common/app_config.dart.bak
|
||||||
|
# 版本号递增日志
|
||||||
|
build_versions.log
|
||||||
|
pubspec.yaml.version_bak
|
||||||
|
|||||||
@ -56,10 +56,13 @@ class KRDomain {
|
|||||||
// 🔧 P1修复:减少域名检测超时时间
|
// 🔧 P1修复:减少域名检测超时时间
|
||||||
static const int kr_domainTimeout = 2; // 域名检测超时时间(秒)3→2
|
static const int kr_domainTimeout = 2; // 域名检测超时时间(秒)3→2
|
||||||
static const int kr_totalTimeout = 4; // 总体超时时间(秒)6→4
|
static const int kr_totalTimeout = 4; // 总体超时时间(秒)6→4
|
||||||
|
// 🔧 修复5:域名检测总超时时间(防止多层检测累加)
|
||||||
|
static const int kr_maxDomainSwitchTimeout = 10; // 域名切换最大总超时(秒)
|
||||||
static Set<String> _triedDomains = {}; // 已尝试过的域名集合
|
static Set<String> _triedDomains = {}; // 已尝试过的域名集合
|
||||||
static Map<String, int> _domainResponseTimes = {}; // 域名响应时间记录
|
static Map<String, int> _domainResponseTimes = {}; // 域名响应时间记录
|
||||||
static Map<String, DateTime> _domainLastCheck = {}; // 域名最后检测时间
|
static Map<String, DateTime> _domainLastCheck = {}; // 域名最后检测时间
|
||||||
static const int _domainCacheDuration = 300; // 域名缓存时间(秒)
|
// 🔧 修复6:增加缓存时长 300秒(5分钟) → 600秒(10分钟)
|
||||||
|
static const int _domainCacheDuration = 600; // 域名缓存时间(秒)
|
||||||
|
|
||||||
// Dio 实例及初始化
|
// Dio 实例及初始化
|
||||||
static final Dio _dio = (() {
|
static final Dio _dio = (() {
|
||||||
@ -88,6 +91,32 @@ class KRDomain {
|
|||||||
/// WebSocket 域名
|
/// WebSocket 域名
|
||||||
static String get kr_ws => "$kr_currentDomain/v1/app";
|
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中提取域名
|
/// 从URL中提取域名
|
||||||
static String kr_extractDomain(String url) {
|
static String kr_extractDomain(String url) {
|
||||||
try {
|
try {
|
||||||
@ -192,10 +221,11 @@ class KRDomain {
|
|||||||
if (lastCheck != null) {
|
if (lastCheck != null) {
|
||||||
final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds;
|
final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds;
|
||||||
if (timeSinceLastCheck < _domainCacheDuration) {
|
if (timeSinceLastCheck < _domainCacheDuration) {
|
||||||
|
// 🔧 修复2:放宽缓存阈值 5000ms → 10000ms
|
||||||
// 使用缓存的响应时间判断域名是否可用
|
// 使用缓存的响应时间判断域名是否可用
|
||||||
final responseTime = _domainResponseTimes[domain];
|
final responseTime = _domainResponseTimes[domain];
|
||||||
if (responseTime != null && responseTime < 5000) { // 5秒内响应认为可用
|
if (responseTime != null && responseTime < 10000) { // 10秒内响应认为可用
|
||||||
KRLogUtil.kr_i('📋 使用缓存结果,域名 $domain 可用(缓存时间: ${timeSinceLastCheck}s)', tag: 'KRDomain');
|
KRLogUtil.kr_i('📋 使用缓存结果,域名 $domain 可用(缓存时间: ${timeSinceLastCheck}s,响应时间: ${responseTime}ms)', tag: 'KRDomain');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,6 +304,24 @@ class KRDomain {
|
|||||||
KRLogUtil.kr_i('🚀 开始快速域名切换,检测 ${kr_baseDomains.length} 个主域名: $kr_baseDomains', tag: 'KRDomain');
|
KRLogUtil.kr_i('🚀 开始快速域名切换,检测 ${kr_baseDomains.length} 个主域名: $kr_baseDomains', tag: 'KRDomain');
|
||||||
final startTime = DateTime.now();
|
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) {
|
for (String domain in kr_baseDomains) {
|
||||||
final lastCheck = _domainLastCheck[domain];
|
final lastCheck = _domainLastCheck[domain];
|
||||||
@ -281,8 +329,9 @@ class KRDomain {
|
|||||||
final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds;
|
final timeSinceLastCheck = DateTime.now().difference(lastCheck).inSeconds;
|
||||||
if (timeSinceLastCheck < _domainCacheDuration) {
|
if (timeSinceLastCheck < _domainCacheDuration) {
|
||||||
final responseTime = _domainResponseTimes[domain];
|
final responseTime = _domainResponseTimes[domain];
|
||||||
if (responseTime != null && responseTime < 2000) { // 降低缓存阈值
|
// 🔧 修复2:放宽缓存阈值 2000ms → 5000ms
|
||||||
KRLogUtil.kr_i('🎯 使用缓存结果快速切换,域名: $domain', tag: 'KRDomain');
|
if (responseTime != null && responseTime < 5000) { // 5秒内响应认为可用
|
||||||
|
KRLogUtil.kr_i('🎯 使用缓存结果快速切换,域名: $domain (响应时间: ${responseTime}ms)', tag: 'KRDomain');
|
||||||
return domain;
|
return domain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -344,9 +393,19 @@ class KRDomain {
|
|||||||
return localBackupDomain;
|
return localBackupDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 最后兜底方案
|
// 🔧 修复4:验证兜底域名是否可用
|
||||||
KRLogUtil.kr_w('⚠️ 所有域名都失败,使用兜底域名', tag: 'KRDomain');
|
KRLogUtil.kr_w('⚠️ 所有域名都失败,尝试兜底域名', tag: 'KRDomain');
|
||||||
return "api.omntech.com";
|
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) {
|
} catch (e) {
|
||||||
final endTime = DateTime.now();
|
final endTime = DateTime.now();
|
||||||
@ -770,6 +829,24 @@ class KRDomain {
|
|||||||
_triedDomains.add(kr_currentDomain);
|
_triedDomains.add(kr_currentDomain);
|
||||||
KRLogUtil.kr_i('📝 已尝试域名: $_triedDomains', tag: 'KRDomain');
|
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)) {
|
!_triedDomains.contains(kr_currentDomain)) {
|
||||||
@ -1137,6 +1214,10 @@ class AppConfig {
|
|||||||
|
|
||||||
_isInitializing = true;
|
_isInitializing = true;
|
||||||
try {
|
try {
|
||||||
|
// 🔧 修复6:启动时优先加载上次成功的域名
|
||||||
|
await KRDomain.kr_loadBaseDomain();
|
||||||
|
KRLogUtil.kr_i('📍 当前使用域名: ${KRDomain.kr_currentDomain}', tag: 'AppConfig');
|
||||||
|
|
||||||
// 所有模式都走正常的配置请求流程
|
// 所有模式都走正常的配置请求流程
|
||||||
KRLogUtil.kr_i('🚀 开始配置初始化', tag: 'AppConfig');
|
KRLogUtil.kr_i('🚀 开始配置初始化', tag: 'AppConfig');
|
||||||
await _startAutoRetry(onSuccess);
|
await _startAutoRetry(onSuccess);
|
||||||
|
|||||||
@ -68,6 +68,10 @@ class KRSplashController extends GetxController {
|
|||||||
KRLogUtil.kr_i('[SPLASH_TIMING] 🎬 启动页控制器 onInit', tag: 'SplashController');
|
KRLogUtil.kr_i('[SPLASH_TIMING] 🎬 启动页控制器 onInit', tag: 'SplashController');
|
||||||
KRLogUtil.kr_i('[SPLASH_TIMING] ═══════════════════════════════════════', tag: 'SplashController');
|
KRLogUtil.kr_i('[SPLASH_TIMING] ═══════════════════════════════════════', tag: 'SplashController');
|
||||||
|
|
||||||
|
// 🔧 修复1:应用启动时清理域名检测静态状态
|
||||||
|
print('🧹 清理域名检测状态...');
|
||||||
|
KRDomain.kr_resetDomainState();
|
||||||
|
|
||||||
// 🔧 P2优化:网站配置和设备登录在后台执行,不阻塞主流程
|
// 🔧 P2优化:网站配置和设备登录在后台执行,不阻塞主流程
|
||||||
print('🌐 启动后台任务:网站配置加载...');
|
print('🌐 启动后台任务:网站配置加载...');
|
||||||
KRLogUtil.kr_i('🌐 后台任务:网站配置和设备登录', tag: 'SplashController');
|
KRLogUtil.kr_i('🌐 后台任务:网站配置和设备登录', tag: 'SplashController');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user