Files
plezy/tvos/Runner/Plugins/connectivity_plus/PathMonitorConnectivityProvider.swift
T
2026-04-24 14:11:24 +02:00

70 lines
1.8 KiB
Swift

import Foundation
import Network
public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {
// Use .utility, as it is intended for tasks that the user does not track actively.
// See: https://developer.apple.com/documentation/dispatch/dispatchqos
private let queue = DispatchQueue.global(qos: .utility)
private var pathMonitor: NWPathMonitor?
private func connectivityFrom(path: NWPath) -> [ConnectivityType] {
var types: [ConnectivityType] = []
// Check for connectivity and append to types array as necessary
if path.status == .satisfied {
if path.usesInterfaceType(.wifi) {
types.append(.wifi)
}
if path.usesInterfaceType(.cellular) {
types.append(.cellular)
}
if path.usesInterfaceType(.wiredEthernet) {
types.append(.wiredEthernet)
}
if path.usesInterfaceType(.other) {
types.append(.other)
}
}
return types.isEmpty ? [.none] : types
}
public var currentConnectivityTypes: [ConnectivityType] {
let path = ensurePathMonitor().currentPath
return connectivityFrom(path: path)
}
public var connectivityUpdateHandler: ConnectivityUpdateHandler?
override init() {
super.init()
_ = ensurePathMonitor()
}
public func start() {
_ = ensurePathMonitor()
}
public func stop() {
pathMonitor?.cancel()
pathMonitor = nil
}
@discardableResult
private func ensurePathMonitor() -> NWPathMonitor {
if (pathMonitor == nil) {
let pathMonitor = NWPathMonitor()
pathMonitor.start(queue: queue)
pathMonitor.pathUpdateHandler = pathUpdateHandler
self.pathMonitor = pathMonitor
}
return self.pathMonitor!
}
private func pathUpdateHandler(path: NWPath) {
connectivityUpdateHandler?(connectivityFrom(path: path))
}
}