修正VMess 和 VLESS TLS配置问题,并且修改了切换节点的逻辑
(cherry picked from commit 8c34c2b0d31ee37a566de6dcb3ec62b7bb0a7222)
This commit is contained in:
@@ -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 自动覆盖用户的手动选择
|
||||
|
||||
Reference in New Issue
Block a user