fix network

This commit is contained in:
JinJiangHuang
2026-03-10 21:37:51 +08:00
parent 76ed32ccf3
commit fac70d7496
7 changed files with 383 additions and 37 deletions
+66
View File
@@ -0,0 +1,66 @@
import Foundation
import Network
import Combine
/// NWPathMonitor
/// UI 线
@MainActor
final class NetworkMonitor: ObservableObject {
static let shared = NetworkMonitor()
///
@Published private(set) var isConnected: Bool = true
/// Wi-Fi / / 线 /
@Published private(set) var connectionType: ConnectionType = .unknown
///
let networkRestoredPublisher = PassthroughSubject<Void, Never>()
enum ConnectionType: String {
case wifi = "Wi-Fi"
case cellular = "蜂窝"
case wiredEthernet = "有线"
case unknown = "未知"
}
private let monitor = NWPathMonitor()
private let monitorQueue = DispatchQueue(label: "com.tvbox.networkmonitor", qos: .utility)
private var wasDisconnected = false
private init() {
startMonitoring()
}
private func startMonitoring() {
monitor.pathUpdateHandler = { [weak self] path in
Task { @MainActor [weak self] in
guard let self else { return }
let connected = path.status == .satisfied
let previouslyConnected = self.isConnected
self.isConnected = connected
self.connectionType = Self.resolveConnectionType(path)
if connected && !previouslyConnected {
self.networkRestoredPublisher.send()
}
if !connected {
self.wasDisconnected = true
}
}
}
monitor.start(queue: monitorQueue)
}
private static func resolveConnectionType(_ path: NWPath) -> ConnectionType {
if path.usesInterfaceType(.wifi) { return .wifi }
if path.usesInterfaceType(.cellular) { return .cellular }
if path.usesInterfaceType(.wiredEthernet) { return .wiredEthernet }
return .unknown
}
deinit {
monitor.cancel()
}
}