NWPathMonitor не реагирует на изменения профиля Network Link Conditioner

Я разрабатываю приложение для macOS и хочу проверить состояние подключения. Я создал простой наблюдатель подключений, используя NWPathMonitor; Я использую его как объект среды:

@Observable
class ConnectivityMonitor {
    private let queue = DispatchQueue(label: "ConnectivityMonitorQueue")
    private let monitor = NWPathMonitor()
    
    private(set) var isConnected: Bool = false
    
    init() {
        monitor.pathUpdateHandler = { [weak self] path in
            DispatchQueue.main.async {
                self?.isConnected = path.status == .satisfied
                print("network path changed: ", path.status)
            }
        }
        monitor.start(queue: queue)
    }
}

Чтобы проверить различные состояния подключения, я использую префпанель Network Link Conditioner (я назову ее NLC), поставляемую Apple с дополнительными инструментами Xcode.

Я не знаю почему, но NWPathMonitor не реагирует на изменения профиля NLC.

Например; Я установил профиль NLC на 100% Потеря, что означает, что в сети вообще нет подключения к Интернету. Но NWPathMonitor pathUpdateHandler не вызывается.

Я что-то пропустил? Спасибо.


1
72
1

Ответ:

Решено

100% потеря — это не то же самое, что отключение. NWPathMonitor проверяет наличие маршрута. Под маршрутом я подразумеваю наличие локального сетевого интерфейса, который будет принимать пакеты, предназначенные для данного адреса.

Такой маршрут существует. Бывает, что каждый пакет отбрасывается, но монитор этого не знает и не может знать. Единственный способ узнать, будет ли пакет доставлен, — это отправить пакет и получить ответ. NWPathMonitor вообще не отправляет пакеты, поэтому не видит потери пакетов.

NLC также по своей конструкции не изменяет конфигурацию сети для 100% потери пакетов. Тестирование этой распространенной ситуации (подключение, но не доставка пакетов) чрезвычайно полезно и сложно сделать иначе. Проверить «действительно отключенное соединение» легко: выключите сеть. Но моделирование сетей, не подключающихся к Интернету (например, в аэропортах или других предприятиях, предлагающих Wi-Fi), является идеальным вариантом использования NLC.

Как правило, проверки «достижимости» имеют ограниченное применение. Они могут сказать вам, что система даже не попытается отправить пакет, потому что радио выключено, и они особенно хорошо подскажут вам, когда стоит повторить попытку неудачного соединения. Но они не могут сказать вам, что отправленные вами сообщения действительно будут доставлены. В конце концов, вам нужно отправить пакет и посмотреть, что произойдет.

Это не недостаток NWPathMonitor. Это основной факт о сетях. Они как почтовое отделение. Невозможно узнать, будет ли письмо, которое вы положили в свой почтовый ящик, действительно доставлено, и если да, то ответит ли другая сторона. NWPathMonitor говорит вам: «Да, на углу стоит почтовый ящик, и он не заперт». Если ваш почтовый оператор решил выбросить все письма в канаву (100% потеря пакетов), узнать об этом заранее невозможно.