Posible error en CFNetDiagnosticCopyNetworkStatusPassively? Devolviendo kCFNetDiagnosticConnectionDown solo a través de 3G / 4G.

Tengo un error extraño aquí. Esto solo se manifiesta cuando el dispositivo iOS se utiliza exclusivamente en networkinges 3G / 4G. es decir, si a través de Wi-Fi – sin errores y todo funciona bien.

- ( BOOL ) isInternetAccessAvailable { CFNetDiagnosticRef diag; diag = CFNetDiagnosticCreateWithURL ( NULL, ( __bridge CFURLRef )[NSURL URLWithString:@"www.apple.com"] ); CFNetDiagnosticStatus status; status = CFNetDiagnosticCopyNetworkStatusPassively ( diag, NULL ); CFRelease ( diag ); if ( status == kCFNetDiagnosticConnectionUp ) { return YES; } else { NSString * title = @"No Internet Connection"; NSString * message = @"Please ensure you have an Internet Connection."; [self showAlertWithTitle:title andMessage:message]; return NO; } } 

De acuerdo, entonces tengo el método anterior que se llama antes de intentar cargar los datos en una UIWebView.

Como dije, a través de una networking WiFi, esto funciona perfectamente.

Si Wi-Fi está apagado (o no está disponible / no conectado) y el dispositivo está usando una tarjeta SIM para networkinges 3G / 4G.

la línea donde están las llamadas:

 status = CFNetDiagnosticCopyNetworkStatusPassively ( diag, NULL ); 

devuelve un largo equivalente a:

 kCFNetDiagnosticConnectionDown 

Por lo tanto, mi testing falla y muestro una advertencia UIAlertView al usuario.

¡Pero la networking está ahí! Si cambio la línea de testing a esto:

 if ( ( status == kCFNetDiagnosticConnectionUp ) || ( status == kCFNetDiagnosticConnectionDown ) ) 

Funciona en 3G / 4G y descarga la página web, por lo que el dispositivo o la networking no tienen la culpa.

Pero la llamada a CFNetDiagnosticCopyNetworkStatusPassively está fallando solo en 3G / 4G.

¿Algunas ideas?

Esto se acaba de encontrar en una aplicación que recientemente aceleré en la App Store para cumplir con los ploops de publicidad y comercialización y si hay un error en mi código, necesito que esto se arregle y se vuelva a enviar lo antes posible.

Error confirmado por Apple.

Dupe si quieres: Bug ID # 12443370

Puede usar esto para verificar la connection.

¿Cómo comprobar si hay una connection a Internet activa en iOS o OSX? .

Respuesta cannyboyn para la versión síncrona: Tome Reachability.h y Reachability.m en https://github.com/tonymillion/Reachability

 #import "Reachability.h" - (BOOL)connected { Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus networkStatus = [reachability currentReachabilityStatus]; return !(networkStatus == NotReachable); }