2009-08-15 16 views
8

He buscado pero no puedo ver una pregunta similar.La accesibilidad a veces falla, incluso cuando tenemos una conexión a Internet

Agregué un método para verificar la conexión a Internet según el ejemplo de Accesibilidad. Funciona la mayor parte del tiempo, pero cuando se instala en el iPhone, a menudo falla incluso cuando tengo conectividad a Internet (solo cuando estoy en 3G/EDGE - WiFi está bien).

Básicamente el código de abajo devuelve NO.

Si cambio a otra aplicación, diga Correo o Safari, y me conecto, luego vuelvo a la aplicación, luego el código dice que se puede acceder a Internet. Parece que necesita un 'empujoncito'.

¿Alguien ha visto esto antes? ¿Algunas ideas?

Muchas gracias James

+ (BOOL) doWeHaveInternetConnection{ 

BOOL success; 
// google should always be up right?! 
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, 
                      host_name); 
SCNetworkReachabilityFlags flags; 
success = SCNetworkReachabilityGetFlags(reachability, &flags); 
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 

if (isAvailable) { 
    NSLog(@"Google is reachable: %d", flags); 
}else{ 
    NSLog(@"Google is unreachable"); 
} 

return isAvailable; 

}

Respuesta

7

Parece que has despojado a cabo un cierto código de accesibilidad básica del ejemplo de código de Apple. ¿Qué sucede cuando lo dejas intacto y haces esto?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

if (netStatus == NotReachable) 
{ 
    NSLog(@"NotReachable"); 
} 

if (netStatus == ReachableViaWiFi) 
{ 
    NSLog(@"ReachableViaWiFi"); 
} 

if (netStatus == ReachableViaWWAN) 
{ 
    NSLog(@"ReachableViaWWAN"); 
} 
+0

Disculpas, soy un poco novato. Agregué el ejemplo de clases de Accesibilidad a mi proyecto, pero no puedo compilar. \t Accesibilidad * hostReach = [[Reachability reachabilityWithHostName: @ "www.apple.com"] retain]; No funciona. No se puede encontrar el método reachabilityWithHostName. Voy a seguir afinando ... – stoutyhk

+0

esto funciona: + (BOOL) doWeHaveInternetConnection2 { \t \t si ([[Accesibilidad sharedReachability] internetConnectionStatus] == NotReachable) { \t \t retorno NO; \t} \t demás \t { \t \t retorno SÍ; \t} \t } – stoutyhk

+1

ese código siempre le da "NotConnected" aunque está conectado. pero una vez que va al método "alcanzadaChanged" le da el estado correcto.Entonces, ¿cómo obtener el estado correcto en primer lugar? – Nnp

1
+ (BOOL) doWeHaveInternetConnection2{ 
     if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable) { 
        return NO; 
      } 
      else 
      { 
        return YES; 
      } 

} 

(lo siento, formato de código no funcionaba en comentario)

+0

La llamada a '+ sharedReachability' me indica que está utilizando una versión anterior a 2.0 de Reachability. La última versión se publicó hace aproximadamente una semana, y funciona mucho mejor que la que usaba un singleton. La respuesta de Matt a continuación se basa en la última versión, por lo que tuvo problemas para compilarla. Obtenga la última versión y vea si se adapta mejor a sus necesidades. – Tim

+0

Gracias - no sabía que había una nueva versión. Muchas gracias. – stoutyhk

1

Con la versión 2, el código debe ser:

+ (BOOL) doWeHaveInternetConnection2{ 

if([Reachability reachabilityForInternetConnection] == NotReachable) { 
    return NO; 
} 
else 
{ 
    return YES; 
} 

}

+0

// reachabilityForInternetConnection: comprueba si la ruta predeterminada está disponible. // Debería ser utilizado por aplicaciones que no se conectan a un host en particular – stoutyhk

+0

Al probar esta última noche, en el dispositivo iphone, en modo avión, este código devolvió SÍ, pero luego al recuperar una URL, falló. Entonces no usaría esto. Volviendo a verificar la conexión a un host en particular. – stoutyhk

+0

Probar una conexión a un host particular usando reachabilityWithHostName devolverá un falso positivo, aparentemente cada vez que su teléfono tenga asignada una dirección IP. Pruébelo: desenchufe el cable de su enrutador inalámbrico mientras su teléfono está conectado y verifique el resultado de [Reachability reachabilityWithHostName:] Será SÍ cada vez, aunque obviamente no puede comunicarse con el host. – Oscar

1

Lo que he encontrado es que debe conocer qué hilo (runloop) llama primero al startNotifier. Si lo llamas desde un hilo de fondo o NSOperation, comenzarás el bucle notificador en el bucle de ejecución de ese hilo.

Si comparte instancias, tal vez capturando un singleton como en [Reachability reachabilityForInternetConnection], del código actual (2.0) aparece que el último invocador gana y obtiene el notificador establecido en su ciclo de ejecución.

Cuestiones relacionadas