Я разрабатываю приложение для 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
не вызывается.
Я что-то пропустил? Спасибо.
100% потеря — это не то же самое, что отключение. NWPathMonitor
проверяет наличие маршрута. Под маршрутом я подразумеваю наличие локального сетевого интерфейса, который будет принимать пакеты, предназначенные для данного адреса.
Такой маршрут существует. Бывает, что каждый пакет отбрасывается, но монитор этого не знает и не может знать. Единственный способ узнать, будет ли пакет доставлен, — это отправить пакет и получить ответ. NWPathMonitor
вообще не отправляет пакеты, поэтому не видит потери пакетов.
NLC также по своей конструкции не изменяет конфигурацию сети для 100% потери пакетов. Тестирование этой распространенной ситуации (подключение, но не доставка пакетов) чрезвычайно полезно и сложно сделать иначе. Проверить «действительно отключенное соединение» легко: выключите сеть. Но моделирование сетей, не подключающихся к Интернету (например, в аэропортах или других предприятиях, предлагающих Wi-Fi), является идеальным вариантом использования NLC.
Как правило, проверки «достижимости» имеют ограниченное применение. Они могут сказать вам, что система даже не попытается отправить пакет, потому что радио выключено, и они особенно хорошо подскажут вам, когда стоит повторить попытку неудачного соединения. Но они не могут сказать вам, что отправленные вами сообщения действительно будут доставлены. В конце концов, вам нужно отправить пакет и посмотреть, что произойдет.
Это не недостаток NWPathMonitor
. Это основной факт о сетях. Они как почтовое отделение. Невозможно узнать, будет ли письмо, которое вы положили в свой почтовый ящик, действительно доставлено, и если да, то ответит ли другая сторона. NWPathMonitor
говорит вам: «Да, на углу стоит почтовый ящик, и он не заперт». Если ваш почтовый оператор решил выбросить все письма в канаву (100% потеря пакетов), узнать об этом заранее невозможно.