Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does NWPathMonitor not give a path update when the path becomes satisfied?

I have a simple class named NetworkPathMonitor that looks as follows:

class NetworkPathMonitor: ObservableObject, Cancellable {
    @Published var path: NWPath? = nil
    
    let monitor = NWPathMonitor()
    
    init() {
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                self?.path = path
            }
        }
        monitor.start(queue: DispatchQueue.global(qos: .background))
    }
    
    func cancel() {
        monitor.cancel()
    }
    
    deinit {
        cancel()
    }
}

Although pathUpdateHandler is called when I disable and enable WiFi the outcome is not always reliable. When I disable the WiFi the current path is unsatisfied (No network route), however when I enable WiFi again it calls pathUpdateHandler again with the same path unsatisfied (No network route).

However in my UI I have a button that says Retry. When I press it, it will destroy the current monitor and build a new one. The first message now says satisfied (Path is satisfied), interface: en0. Meaning, perhaps it took some time for the WiFi to establish the network route but when the network did become available it did not call pathUpdateHandler again.

like image 822
Mark Avatar asked Sep 05 '25 03:09

Mark


1 Answers

The code did work on a real device.

Do not test NWPathMonitor on an iOS Simulator, because it will not give you a reliable result.

like image 199
Mark Avatar answered Sep 07 '25 19:09

Mark