修正VMess 和 VLESS TLS配置问题,并且修改了切换节点的逻辑

(cherry picked from commit 8c34c2b0d31ee37a566de6dcb3ec62b7bb0a7222)
This commit is contained in:
2025-10-31 15:16:49 +08:00
committed by speakeloudest
parent b79ce2d15a
commit c5715f77e2
4 changed files with 232 additions and 29 deletions
@@ -1081,6 +1081,34 @@ class KRSingBoxImp {
}
});
}
// 🔧 关键修复:恢复用户选择的节点
try {
final selectedNode = await KRSecureStorage().kr_readData(key: _keySelectedNode);
if (selectedNode != null && selectedNode.isNotEmpty) {
KRLogUtil.kr_i('🎯 恢复用户选择的节点: $selectedNode', tag: 'SingBox');
print('🔵 启动后恢复节点选择: $selectedNode');
// 延迟500ms确保sing-box完全启动
await Future.delayed(const Duration(milliseconds: 500));
// 🔧 关键修复:使用 await 等待节点切换完成
try {
await kr_selectOutbound(selectedNode);
KRLogUtil.kr_i('✅ 节点已切换到用户选择: $selectedNode', tag: 'SingBox');
print('🔵 节点切换成功: $selectedNode');
} catch (e) {
KRLogUtil.kr_e('❌ 节点切换失败: $e', tag: 'SingBox');
print('🔵 节点切换失败: $e');
}
} else {
KRLogUtil.kr_i('️ 没有保存的节点选择,使用默认配置', tag: 'SingBox');
print('🔵 没有保存的节点选择,使用默认');
}
} catch (e) {
KRLogUtil.kr_e('❌ 恢复节点选择失败: $e', tag: 'SingBox');
print('🔵 恢复节点选择失败: $e');
}
});
} catch (e, stackTrace) {
KRLogUtil.kr_e('💥 SingBox 启动异常: $e', tag: 'SingBox');
@@ -1267,29 +1295,30 @@ class KRSingBoxImp {
// 节点选择监控定时器
Timer? _nodeSelectionTimer;
void kr_selectOutbound(String tag) async {
Future<void> kr_selectOutbound(String tag) async {
KRLogUtil.kr_i('🎯 [v2.1] 开始选择出站节点: $tag', tag: 'SingBox');
KRLogUtil.kr_i('📊 当前活动组数量: ${kr_activeGroups.length}', tag: 'SingBox');
// 持久化用户选择的节点(异步执行,不阻塞UI)
KRSecureStorage().kr_saveData(key: _keySelectedNode, value: tag).then((_) {
// 🔧 关键修复:使用 await 确保保存完成
try {
await KRSecureStorage().kr_saveData(key: _keySelectedNode, value: tag);
KRLogUtil.kr_i('✅ 节点选择已保存: $tag', tag: 'SingBox');
}).catchError((e) {
} catch (e) {
KRLogUtil.kr_e('❌ 保存节点选择失败: $e', tag: 'SingBox');
});
}
// ⚠️ 关键修复:确保 command client 初始化
// 借鉴 Hiddify:通过触发 watchGroups() 来初始化 command client
_kr_ensureCommandClientInitialized().then((_) {
// 🔧 关键修复:使用 await 确保 command client 初始化完成
try {
await _kr_ensureCommandClientInitialized();
KRLogUtil.kr_i('✅ Command client 已就绪,执行节点切换', tag: 'SingBox');
// 🔄 使用重试机制执行节点选择(异步执行,不阻塞UI)
_kr_selectOutboundWithRetry("select", tag, maxAttempts: 3, initialDelay: 50).catchError((e) {
KRLogUtil.kr_e(' 节点选择失败: $e', tag: 'SingBox');
});
}).catchError((e) {
KRLogUtil.kr_e('❌ Command client 初始化失败,节点切换取消: $e', tag: 'SingBox');
});
// 🔧 关键修复:使用 await 等待节点选择完成
await _kr_selectOutboundWithRetry("select", tag, maxAttempts: 3, initialDelay: 50);
KRLogUtil.kr_i(' 节点切换完成: $tag', tag: 'SingBox');
} catch (e) {
KRLogUtil.kr_e('❌ 节点选择失败: $e', tag: 'SingBox');
rethrow; // 抛出异常,让调用者知道失败了
}
// 🔄 如果用户选择了具体节点(不是 auto),启动定期检查和重新选择
// 这是为了防止 urltest 自动覆盖用户的手动选择