Skip to content

Conversation

@yafeisun
Copy link

这个 PR 包含了以下修复:

  • 修复订阅测速完成后立即更新的问题
  • 修复 iOS 后台测速暂停的问题
  • 修复订阅更新打断其他订阅测速的问题

这些修复改进了订阅管理的稳定性和用户体验。

问题描述:
当多个订阅(A、B、C)一起测速时,如果A订阅正在更新,会导致B和C订阅的测速也被暂停。
原代码使用全局的_updatingSubscription标志来防止订阅更新,但这个标志会阻止所有订阅的测速,
即使只有某个特定订阅在更新。

修复措施:
1. 添加_speedTestInProgress变量来跟踪全局测速进度
2. 将schedulerTestLatency方法中的全局_updatingSubscription检查改为检查特定订阅是否在_remoteReloading集合中
3. 在testOutboundLatencyForServer方法中添加对特定订阅是否更新的检查
4. 在schedulerTestLatency方法中添加_speedTestInProgress的设置

修改后的行为:
- 只有正在更新的订阅会被跳过,其他订阅的测速可以正常进行
- 每个订阅的测速是独立控制的,不会互相干扰
- A订阅更新时,B和C订阅的测速可以继续进行

修改文件:
- lib/app/modules/server_manager.dart
问题描述:
在iOS客户端上,当测速过程中切换到其他APP界面时,karing的测速过程会暂停没有进展,
只有切回karing测速界面时,才能看到进度继续。同样,手机屏幕锁定时测速也会被暂停。

根本原因:
iOS应用进入后台时,Flutter的Dart代码执行会被暂停,导致正在进行的异步HTTP请求被挂起。
只有当应用回到前台时,这些操作才会继续执行。测速是通过调用ClashApi.getDelay方法进行的,
该方法会发送HTTP请求到本地代理服务器,这些请求在后台会被挂起。

修复措施:
在iOS的Info.plist中添加后台任务配置,允许应用在后台继续执行网络请求和处理任务。
具体配置:
1. UIBackgroundModes - network-fetching: 允许应用在后台继续执行网络请求
2. UIBackgroundModes - processing: 允许应用在后台继续执行处理任务

修改后的行为:
- 应用切换到后台时,测速可以继续进行
- 屏幕锁定时,测速可以继续进行
- 用户可以在测速期间使用其他应用,不会影响测速进度

注意事项:
- Apple对后台执行有限制,但配置后台模式后,应用可以在后台继续执行网络请求
- 对于VPN应用,这些后台模式是合理且必要的
- 此修复仅影响iOS平台,其他平台不受影响

修改文件:
- ios/Runner/Info.plist
问题描述:
当多个订阅(A、B、C)一起测速时,如果A订阅设置了"测速完成删除无效节点"或"隐藏无效节点",
原实现是等到所有订阅的测速都完成后才统一更新所有订阅。这导致A订阅的节点测完后,
无效节点不会立即被删除/隐藏,用户需要等到所有订阅都测完才能看到更新。

根本原因:
原代码只在_testOutboundServerLatencying为空时(即所有订阅都测完)才调用removeLatencyError
并触发UI更新。这种设计无法支持单个订阅的即时更新。

修复措施:
1. 添加_checkAndUpdateGroupAfterTestComplete方法,用于检查并更新单个订阅
2. 该方法在_testOutboundLatencyForServer中被调用(测速成功和失败时都会调用)
3. 方法逻辑:
   - 检查该订阅是否还有节点正在测速
   - 如果没有节点在测速,并且该订阅启用了testLatencyAutoRemove
   - 立即调用removeLatencyError删除/隐藏无效节点
   - 触发_onLatencyUpdateConfigs回调更新UI
   - 调用saveServerConfig保存配置

修改后的行为:
- A订阅的节点测完 → 立即删除/隐藏A订阅的无效节点
- B订阅的节点测完 → 立即删除/隐藏B订阅的无效节点
- C订阅的节点测完 → 立即删除/隐藏C订阅的无效节点
- 每个订阅的更新是独立的,不会互相影响
- 用户可以实时看到每个订阅的测速结果和节点状态变化

修改文件:
- lib/app/modules/server_manager.dart
@GooRingX GooRingX merged commit bd592ea into KaringX:main Feb 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants