Подтвердить что ты не робот

Использование возможности для Интернета * или * локального WiFi?

Я искал SO для ответа на этот вопрос, и на самом деле он не был адресован, по крайней мере, не до такой степени, что я могу заставить его работать.

Я изначально только проверял доступность Интернета, используя:

self.wwanReach = [Reachability reachabilityWithHostName:@"www.apple.com"];
[wwanReach startNotifer];

Теперь мне нужно поддерживать локальное WiFi-соединение (при отсутствии доступа к Интернету в целом), и когда я нашел +reachabilityForLocalWiFi, я также заметил, что есть +reachabilityForInternetConnection. Я решил, что могу использовать их вместо жесткого кодирования "www.apple.com" там, но, увы, когда я использую:

self.wwanReach = [Reachability reachabilityForInternetConnection];
[wwanReach startNotifer];
self.wifiReach = [Reachability reachabilityForLocalWiFi];
[wifiReach startNotifer];

обратный вызов достижимости, который я настроил "никогда", вызывается, для значений "никогда" до 10, 12, 15 минут или около того (это было до тех пор, пока мое терпение продолжалось. (Терпение пользователя будет много меньше, я уверен.) Переключение обратно на + достижимостьWithHostName: работает в течение нескольких секунд. Я также пробовал каждую "пару" индивидуально, если возникла проблема с двумя одновременно активируемыми нотификаторами, но это не имело значения.

Итак: Каким образом можно определить доступность к Интернету /WWAN или локальной сети Wifi (либо одному, либо и тому и другому)?

[Этот конкретный вариант использования - это iPhone или iPad, подключаемый к сети Mac mini от компьютера к компьютеру; Я уверен, что применяются другие ситуации.]

4b9b3361

Ответ 1

Используйте эту функцию, чтобы проверить, включен ли wifi

- (BOOL)isWifiOn {
    Reachability* wifiReach = [Reachability reachabilityForLocalWiFi];

    NetworkStatus netStatus = [wifiReach currentReachabilityStatus];
    return (netStatus==ReachableViaWiFi);
}

Аналогичный код можно использовать для проверки доступности для Интернета, но вы должны проверить

(netStatus==ReachableViaWiFi)

если вам все равно, что над wifi AND

(netStatus==ReachableViaWWAN)

если вам это нравится по WWAN

Ответ 2

Я столкнулся с той же проблемой. В итоге я нашел, что для достижения WWAN или WiFi, обратный вызов уведомления вызывается только при изменении сети.

Другими словами, проверьте текущую доступность сразу же после создания объекта достижимости. Не ждите уведомления, потому что уведомление будет опубликовано только после следующего изменения сети.

Для Интернета /WWAN:

self.wwanReach = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [wwanReach currentReachabilityStatus];
if (networkStatus == ReachableViaWWAN) {
    // do something
}

Для Wi-Fi:

self.wifiReach = [Reachability reachabilityForLocalWiFi];
NetworkStatus networkStatus = [wifiReach currentReachabilityStatus];
if (networkStatus == ReachableViaWiFi) {
    // do something
}

Ответ 3

Пример достижимости из apple показывает вам, как использовать уведомление, которое является моделью push-событий и должно быть эффективным, но я обнаружил, что уведомления не всегда корректно работают для меня. Иногда они не стреляли, иногда они предоставляли неверную информацию. Таким образом, я закончил опрос с 2-секундным повторяющимся таймером и проверил для Wi-Fi с процедурой, подобной той, что описана выше . Здесь хорошая ссылка для реализации таймера.

Ответ 4

Я не уверен, что это ваша проблема, но я заметил, что это важно, когда вы вызываете startNotifier. У меня была аналогичная проблема с тем, что я никогда не получал уведомлений (но с более короткими значениями для "никогда" - я думаю, что я не как пейнт), пока я не переместил вызов startNotifier в некоторый код пользовательского интерфейса, в частности applicationDidFinishLaunching.