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:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user