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 не вызывается.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

Спасибо, что объяснили ситуацию, как идиоту :) И все же, в моем случае было бы здорово как-то знать, как работает почта в то время. У меня никогда не было случая, когда мне нужно было знать текущий статус подключения к Интернету. В целом NWPathMonitor/Reachability хватило. Вы отправляете запросы; они идут или нет, возможно, из-за результата, который вы показываете, или из-за всплывающего сообщения об ошибке. А как насчет длительного опроса под капотом? Я думаю, что это может удовлетворить мою потребность.

Arda Oğul Üçpınar 19.06.2024 18:54

Длинный опрос не сильно поможет, так как пакеты они отправляют не очень часто. Если соединение настроено с поддержкой TCP, пакеты могут отправляться каждые несколько минут или каждые пару часов. (Я не проверял значения по умолчанию в macOS.) Обычно они не очень полезны для обнаружения обрыва сети. Правильный подход обычно заключается в том, чтобы просто отправить данные и устранить ошибки, если они возникнут. Вы всегда должны это делать, потому что всегда могут возникнуть ошибки. Но если вы хотите опросить систему, обычным решением будет периодическая отправка контрольного сообщения на ваш сервер и проверка получения ответа.

Rob Napier 19.06.2024 22:33

Существует стандартный инструмент «сердцебиения» под названием ICMP Ping, но многие системы блокируют его, поэтому он бесполезен. Чаще всего вы создаете на своем сервере конечную точку HTTP, которая ничего не делает, кроме возврата 200. И вы пингуете ее каждый... ну, как бы часто вы ни хотели ее пинговать. Затем вам нужно решить, сколько промахов соответствует разрыву соединения. И тогда вам придется решить, что делать, когда это произойдет.

Rob Napier 19.06.2024 22:35

Еще раз спасибо за ваше время и заботу 🙏

Arda Oğul Üçpınar 20.06.2024 23:44

Другие вопросы по теме