2010-04-15 17 views
11

He buscado SO para la respuesta a esta pregunta, y no está realmente abordado, al menos no hasta el punto en que puedo hacerlo funcionar.Uso de Accesibilidad para Internet * o * WiFi local?

que estaba originalmente sólo la comprobación de accesibilidad de Internet, usando:

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

ahora tengo que soportar una conexión WiFi local (en ausencia de llegar a la Internet en general), y cuando me encontré +reachabilityForLocalWiFi, me También noté que había +reachabilityForInternetConnection. Pensé que podría utilizar estos, en lugar de la codificación dura "www.apple.com" allí, pero por desgracia, cuando uso:

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

la devolución de llamada de accesibilidad que he creado "nunca" es llamada, para valores de "Nunca "hasta 10, 12, 15 minutos más o menos (que fue tan largo como duró mi paciencia. (La paciencia del usuario será mucho menor, estoy seguro). Volver a + disponibilidad con Nombre: funciona en segundos. También probé cada uno" par "individualmente, en caso de que haya un problema con dos notificadores en progreso simultáneamente, pero eso no hizo ninguna diferencia.

Entonces: ¿cuál es la forma apropiada de determinar la accesibilidad a Internet/WWAN o Wif local? i red (¿una o ambas)?

[Este caso de uso particular es un iPhone o iPad que se conecta a una red Mac mini de computadora a computadora; Estoy seguro de que se aplican otras situaciones.]

Respuesta

21

Utilice esta función para comprobar si hay wifi en

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

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

código similar puede ser utilizado para comprobar reachabilityForInternetConnection pero hay que comprobar

(netStatus==ReachableViaWiFi) 

si te importa que haya terminado wifi Y

(netStatus==ReachableViaWWAN) 

si te importa que se acabe WWAN

+1

Creo que la pregunta original es sobre conseguir notificado de los cambios en lugar de probar el estado actual. –

+0

notificaciones no funcionó correctamente para mí, pero sondear repetidamente con el método descrito anteriormente funciona muy bien. – Alex

0

No estoy seguro de si este es su problema, pero me di cuenta de que es importante cuando llama a startNotifier. Estaba teniendo un problema similar con nunca recibir notificaciones (pero con valores más cortos para "nunca" - supongo que no soy tan sensible) hasta que moví la llamada startNotifier a algún código UI, específicamente applicationDidFinishLaunching.

1

El ejemplo de accesibilidad de apple le muestra cómo usar una notificación, que es un modelo de evento de evento y se supone que es eficiente, pero descubrí que las notificaciones no siempre funcionaban correctamente para mí. A veces no disparaban, otras veces proporcionaban información incorrecta. Así que terminé sondeando con un temporizador de repetición de 2 segundos, y comprobando wifi con un procedimiento como el described by stinkbutt anterior. Aquí hay un good reference for timer implementation.

7

Me encontré en el mismo problema. Lo que encontré al final es que para WWAN o accesibilidad WiFi, la devolución de llamada de notificación solo se realiza cuando hay un cambio de red.

En otras palabras, verifique la accesibilidad actual inmediatamente después de crear el objeto de accesibilidad. No espere la notificación, ya que la notificación solo se publicará cuando ocurra el siguiente cambio en la red.

Para Internet/WWAN:

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

para WiFi:

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

Gracias por la respuesta, esta es probablemente la respuesta más clara. –

Cuestiones relacionadas