import Foundation import Network import Observation /// Beobachtet, worüber das Gerät gerade am Netz hängt. /// /// Die Unterscheidung WLAN/Mobilfunk entscheidet, welche Bitratengrenze gilt. /// `isExpensive` statt einer Abfrage auf den Schnittstellentyp: der Wert deckt /// auch den Fall ab, dass das iPhone am persönlichen Hotspot eines anderen /// Geräts hängt — technisch WLAN, in der Abrechnung Mobilfunk. @MainActor @Observable public final class NetworkConditions { public private(set) var isReachable = true /// Mobilfunk oder Hotspot — alles, was Datenvolumen kostet. public private(set) var isExpensive = false /// Der Sparmodus für Daten ist an. Dann sollte die App von sich aus /// sparsam sein, auch im WLAN. public private(set) var isConstrained = false private let monitor = NWPathMonitor() public init() { monitor.pathUpdateHandler = { [weak self] path in Task { @MainActor [weak self] in guard let self else { return } isReachable = path.status == .satisfied isExpensive = path.isExpensive isConstrained = path.isConstrained } } monitor.start(queue: DispatchQueue(label: "flixy.network")) } deinit { monitor.cancel() } }