Disponibilidad de AFNetworking 2.0

Estoy tratando de determinar si el usuario está conectado a Internet utilizando AFNetworking 2.0 y el "AFNetworkReachabilityManager", pero parece que no funciona. Siempre regresa que hay una connection a internet válida, aunque el Internet está apagado. Este es mi código:

-(BOOL)connected { __block BOOL reachable; [[AFNetworkReachabilityManager shanetworkingManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusNotReachable: NSLog(@"No Internet Connection"); reachable = NO; break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WIFI"); reachable = YES; break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"3G"); reachable = YES; break; default: NSLog(@"Unkown network status"); reachable = NO; break; [[AFNetworkReachabilityManager shanetworkingManager] startMonitoring]; } }]; return reachable; } 

Este método se llama desde mi método viewDidLoad. ¿Hay algún problema con mi código, ya que no funciona?

Eso es porque ese bloque solo se ejecuta cuando cambia la accesibilidad.

Para get el estado actual, puede hacer esto:

 - (BOOL)connected { return [AFNetworkReachabilityManager shanetworkingManager].reachable; } 

Estás haciendo esto más difícil de lo que necesita ser. Prueba esto:

 - (void)viewDidLoad { [super viewDidLoad]; [[AFNetworkReachabilityManager shanetworkingManager] startMonitoring]; } - (BOOL)connected { return [AFNetworkReachabilityManager shanetworkingManager].reachable; } 

Si también desea recibir una notificación cuando el estado cambia, ejecute setReachabilityStatusChangeBlock

¡Espero que esto ayude!

Tiene dos errores de código que impedirán que su código funcione.

Primero, su llamada a 'comenzar a monitorear' ocurre dentro del bloque que se dispara en respuesta a los cambios de accesibilidad; por lo tanto, el bloque nunca disparará (a less que comience a monitorear en otro lugar).

Segundo, no hay garantías sobre cuándo se disparará ese bloque. Como resultado, siempre verá el retorno 'alcanzable' cualquiera sea el valor al que se haya inicializado, aparentemente esto generalmente es nulo. Incluso si corrige el primer error, no hay ninguna garantía (y es bastante improbable) de que el bloque se dispare antes de que regrese.

Finalmente, en un nivel más general, también está intentando probar de manera síncrona un código que solo puede ejecutarse de forma asíncrona. Es decir, es imposible que el administrador de accesibilidad determine con precisión la accesibilidad instantáneamente. Puede decir "Creo que estoy en WiFi" o "Creo que estoy en 3G", pero también debe verificar si realmente puede llegar a internet (de ahí la capacidad de acceso al nombre) antes de que pueda estar seguro. La accesibilidad no se trata solo de la connection 'Tengo un wifi' o 'Tengo una connection de 3g', sino también de si puede acceder a Internet a través de él. Esto significa que el dispositivo realmente tiene que enviar una request, y aunque esto puede, técnicamente, hacerse de manera sincrónica, cada regla única en el libro insiste en que el código de networking debe hacerse de forma asíncrona, y por una buena razón. Si lo hiciste es sincrónicamente, bloquearías tu UI hasta que la llamada de networking regrese … posiblemente un buen 30, 40, 50, incluso 60 segundos más tarde, dependiendo de los times de espera correspondientes.

Lo que debe hacer es iniciar la monitorización de accesibilidad de singleton en su aplicación, cargue el método del delegado de la aplicación y luego recupere sus datos más adelante. Sin saber la estructura de su aplicación, ni siquiera trataré de garantizar la precisión, pero al less eso debería ayudar.

Prueba esto,

En AppDelegate , el método didFinishLaunchingWithOptions

 { // SETUP AFNETWORKING's NETWORK INDICATOR AND REACHABILITY [AFNetworkActivityIndicatorManager shanetworkingManager].enabled = YES; [[AFNetworkReachabilityManager shanetworkingManager] startMonitoring]; } 

En la class HttpManager ,

 - (BOOL)isNetworkRechable { if ([AFNetworkReachabilityManager shanetworkingManager].reachable) { if ([AFNetworkReachabilityManager shanetworkingManager].isReachableViaWiFi) NSLog(@"Network reachable via WWAN"); else NSLog(@"Network reachable via Wifi"); return YES; } else { NSLog(@"Network is not reachable"); return NO; } } 

En yourViewController ,

 [[HttpManager shanetworkingObject] isNetworkRechable]; 

Nota : no verifique la networkingReabilidad en primer lugar. Porque no funcionará. Por lo tanto, espere un mínimo de 1 segundo para comprobarlo.

Según mi experiencia,

 [[AFNetworkReachabilityManager shanetworkingManager] startMonitoring]; 

lleva un momento para ejecutar setReachabilityStatusChangeBlock por lo que no hay ningún uso que devuelva el valor de -(BOOL)connected .

Por lo tanto, puede realizar algunas tareas una vez que se conecta / desconecta la networking.

La mejor function es verificar la conectividad en el lugar (sincrónicamente):

 [AFNetworkReachabilityManager shanetworkingManager].reachable; 

¡Las otras respuestas están mal! Es mejor usar esto para verificar la disponibilidad:

 if ([AFNetworkReachabilityManager shanetworkingManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) 

La razón por la que se debe a que networkReachabilityStatus inicialmente se establecerá en AFNetworkReachabilityStatusUnknown hasta que se llame al bloque de estado de cambio y esto impida que su código piense que la networking no está disponible cuando no lo está.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [self checkNetworkReachability]; } +(BOOL) isReachable{ return [AFNetworkReachabilityManager shanetworkingManager].reachable; } +(void) checkNetworkReachability{ [[AFNetworkReachabilityManager shanetworkingManager] startMonitoring]; [[AFNetworkReachabilityManager shanetworkingManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); // Check the reachability status and show an alert if the internet connection is not available switch (status) { case -1: // AFNetworkReachabilityStatusUnknown = -1, NSLog(@"The reachability status is Unknown"); break; case 0: // AFNetworkReachabilityStatusNotReachable = 0 NSLog(@"The reachability status is not reachable"); break; case 1: NSLog(@"The reachability status is reachable via wan"); [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil]; break; case 2: // AFNetworkReachabilityStatusReachableViaWiFi = 2 NSLog(@"The reachability status is reachable via WiFi"); [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil]; break; default: break; } }]; }