Fableon/Fableon/Object/Base/Request/FANetworkMonitor.swift
2025-11-04 16:46:56 +08:00

73 lines
2.2 KiB
Swift

//
// FANetworkMonitor.swift
// Fableon
//
// Created by on 2025/10/16.
//
import UIKit
import Network
class FANetworkMonitor {
static let manager = FANetworkMonitor()
///
private(set) var isReachable: Bool?
private(set) var connectionType: NWInterface.InterfaceType?
private(set) var status: NWPath.Status?
private let monitor = NWPathMonitor()
private let queue = DispatchQueue(label: "NetworkMonitorQueue")
func startMonitoring() {
monitor.pathUpdateHandler = { [weak self] path in
guard let self = self else { return }
self.status = path.status
if path.usesInterfaceType(.wifi) {
self.connectionType = .wifi
} else if path.usesInterfaceType(.cellular) {
self.connectionType = .cellular
} else if path.usesInterfaceType(.wiredEthernet) {
self.connectionType = .wiredEthernet
} else {
self.connectionType = nil
}
if path.status == .satisfied, self.connectionType != nil {
if self.isReachable == false {
self.isReachable = true
DispatchQueue.main.async {
NotificationCenter.default.post(name: FANetworkMonitor.networkStatusDidChangeNotification, object: nil)
}
} else {
self.isReachable = true
}
} else {
if self.isReachable == true {
self.isReachable = false
DispatchQueue.main.async {
NotificationCenter.default.post(name: FANetworkMonitor.networkStatusDidChangeNotification, object: nil)
}
} else {
self.isReachable = false
}
}
}
monitor.start(queue: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
extension FANetworkMonitor {
///
@objc static let networkStatusDidChangeNotification = NSNotification.Name(rawValue: "FANetworkMonitor.networkStatusDidChangeNotification")
}