61 lines
1.6 KiB
Swift
61 lines
1.6 KiB
Swift
//
|
|
// NetworkMonitor.swift
|
|
// WOKA
|
|
//
|
|
// Created by MacBook Pro on 28/08/24.
|
|
//
|
|
|
|
import Foundation
|
|
import Network
|
|
|
|
extension Notification.Name {
|
|
static let connectivityStatus = Notification.Name(rawValue: "connectivityStatusChanged")
|
|
}
|
|
|
|
extension NWInterface.InterfaceType: CaseIterable {
|
|
public static var allCases: [NWInterface.InterfaceType] = [
|
|
.other,
|
|
.wifi,
|
|
.cellular,
|
|
.loopback,
|
|
.wiredEthernet
|
|
]
|
|
}
|
|
|
|
final class NetworkMonitor {
|
|
static let shared = NetworkMonitor()
|
|
|
|
private let queue = DispatchQueue(label: "NetworkConnectivityMonitor")
|
|
private let monitor: NWPathMonitor
|
|
|
|
private(set) var isConnected = false
|
|
private(set) var isExpensive = false
|
|
private(set) var currentConnectionType: NWInterface.InterfaceType?
|
|
private var isMonitoring = false
|
|
private init() {
|
|
monitor = NWPathMonitor()
|
|
}
|
|
|
|
func startMonitoring() {
|
|
if isMonitoring{
|
|
print("Already monitoring Network")
|
|
return
|
|
}
|
|
isMonitoring = true
|
|
monitor.pathUpdateHandler = { [weak self] path in
|
|
self?.isConnected = path.status != .unsatisfied
|
|
self?.isExpensive = path.isExpensive
|
|
self?.currentConnectionType = NWInterface.InterfaceType.allCases.filter { path.usesInterfaceType($0) }.first
|
|
|
|
NotificationCenter.default.post(name: .connectivityStatus, object: nil)
|
|
}
|
|
monitor.start(queue: queue)
|
|
}
|
|
|
|
func stopMonitoring() {
|
|
isMonitoring = false
|
|
print("Stopped monitoring Network")
|
|
monitor.cancel()
|
|
}
|
|
}
|