feat(client/native): stats-overhaul Phase1 — 四端实时统计采集端

各原生侧把 libbox/Clash 的实时上下行/延迟经冻结的 pangolin/vpn/stats channel
生产真实帧:
- iOS/macOS 新增 StatsClient.swift(LibboxNewCommandClient,statusInterval 1s,
  uplink/downlink/总量 + urltest 延迟映射契约字段),VpnManager/VpnChannel 状态
  观察驱动 start/stop,pbxproj 登记。
- Android PangolinVpnService.kt 延迟修复。

契约字段 uploadBytes/downloadBytes/uploadSpeed/downloadSpeed/urltestResults 不改。
真机验证(连接后实时跳动)为运行时步骤,见计划 Phase1 待办。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-28 18:13:48 +08:00
parent 636a3bbf2f
commit bf84492eef
7 changed files with 459 additions and 14 deletions
+26
View File
@@ -203,6 +203,32 @@ class VpnManager: NSObject {
guard let self = self else { return }
let s = self.statusString
VpnStatusStreamHandler.shared.push(s)
// CommandClient
// connected CommandServer box stats
switch self.tunnelManager?.connection.status ?? .invalid {
case .connected:
StatsClient.shared.start()
case .disconnected, .invalid:
StatsClient.shared.stop()
default:
break
}
}
// ()app connected .connected
// observer StatsClient start
// tunnelManager(StatsClient.start )
NETunnelProviderManager.loadAllFromPreferences { [weak self] managers, _ in
guard let self = self else { return }
if let mgr = managers?.first(where: {
($0.protocolConfiguration as? NETunnelProviderProtocol)?
.providerBundleIdentifier == self.extensionBundleId
}) {
self.tunnelManager = mgr
}
if self.tunnelManager?.connection.status == .connected {
VpnStatusStreamHandler.shared.push(self.statusString)
StatsClient.shared.start()
}
}
}