2010-04-15 2 views
11

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

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

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

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

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

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

So: Что является подходящим способом определения доступности для Интернета или WWAN или локального i (как один, так и оба)?

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

ответ

21

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

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

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

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

(netStatus==ReachableViaWiFi) 

если вы заботитесь о том, чтобы он превысил Wi-Fi И

(netStatus==ReachableViaWWAN) 

, если вам все равно, что это над WWAN

+1

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

+0

Уведомления не работают должным образом, но повторный опрос с помощью описанного выше метода отлично работает. – Alex

0

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

1

Пример достижимости из apple показывает вам, как использовать уведомление, которое является моделью push-событий и должно быть эффективным, но я обнаружил, что уведомления не всегда работают должным образом для меня. Иногда они не стреляли, иногда они предоставляли неверную информацию. Таким образом, я закончил опрос с 2-секундным повторяющимся таймером и проверил Wi-Fi с процедурой, подобной той, что была приведена выше described by stinkbutt. Вот good reference for timer implementation.

7

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

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

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

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

Для WiFi:

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

Спасибо за ответ, это, наверное, самый ясный ответ. –

Смежные вопросы