¿Cómo usar la clase de accesibilidad para detectar una conexión a internet válida?

Soy nuevo en el desarrollo de iOS y estoy luchando para que funcione la clase de scope. Aquí está mi código para el controlador de vista:

- (void)viewWillAppear:(BOOL)animated { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; internetReachable = [Reachability reachabilityForInternetConnection]; [internetReachable startNotifier]; } - (void)checkNetworkStatus:(NSNotification *)notice { NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; NSLog(@"Network status: %i", internetStatus); } 

Se ve bien, pero no aparece nada en la consola xcode cuando se ejecuta la aplicación y se cambia a esa vista.

Estoy usando Reachability 2.2 y iOS 4.2.

¿Hay algo obvio de que estoy haciendo mal?

EDITADO: Si desea verificar la accesibilidad antes de la ejecución del código, debe usar

 Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus internetStatus = [reachability currentReachabilityStatus]; if (internetStatus != NotReachable) { //my web-dependent code } else { //there-is-no-connection warning } 

También puede agregar un observador de accesibilidad en algún lugar (es decir, en viewDidLoad ):

 Reachability *reachabilityInfo; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myReachabilityDidChangedMethod) name:kReachabilityChangedNotification object:reachabilityInfo]; 

No olvide llamar a [[NSNotificationCenter defaultCenter] removeObserver:self]; cuando ya no necesita detección de accesibilidad (es decir, en el método dealloc ).

Así es como lo hago. Tengo una variable de instancia que configuré en mi método init:

 _reachability = [[APReachability reachabilityForInternetConnection] retain]; 

y cuando necesito consultar el estado de la red, lo hago:

 NetworkStatus networkStatus = [_reachability currentReachabilityStatus]; if (networkStatus != NotReachable) { // Network related code } else { // No network code } 

Si te preocupa wifi, etc., el estado de la red puede ser:

  NotReachable // No network ReachableViaWiFi // Reachable via Wifi ReachableViaWWAN // Reachable via cellular 

Actualización: 4 de noviembre de 2013

Usar la versión de Reachability 3.0 en iOS7

Para construir sobre las respuestas de @ NR4TR y @ codecaffeine:

Hay 5 formas de hacer esto (no comstackdas 🙂

 #include  #include  //1 - Is www.apple.com reachable? Reachability *rHostName = [Reachability reachabilityWithHostName:@"www.apple.com"]; NetworkStatus s1 = [rHostName currentReachabilityStatus]; //2 - Is local wifi router or access point reachable? Reachability *rLocalWiFi = [Reachability reachabilityForLocalWiFi]; NetworkStatus s2 = [rLocalWiFi currentReachabilityStatus]; //3 - Is my access point connected to a router and the router connected to the internet? Reachability *rConnection = [Reachability reachabilityForInternetConnection]; NetworkStatus s3 = [rConnection currentReachabilityStatus]; //4 IPv4 standard addresses checking instead of host to avoid dns lookup step struct sockaddr_in saIPv4; inet_pton(AF_INET, "74.125.239.51", &(saIPv4.sin_addr)); saIPv4.sin_len = sizeof(saIPv4); saIPv4.sin_family = AF_INET; Reachability *rIPv4 = [Reachability reachabilityWithAddress:&saIPv4]; NetworkStatus s4 = [rIPv4 currentReachabilityStatus]; //5 IPv6 addresses checking instead of host to avoid dns lookup step struct sockaddr_in saIPv6; inet_pton(AF_INET, "2607:f8b0:4010:801::1014", &(saIPv6.sin_addr)); saIPv6.sin_len = sizeof(saIPv6); saIPv6.sin_family = AF_INET; Reachability *rIPv6 = [Reachability reachabilityWithAddress:&saIPv6]; NetworkStatus s5 = [rIPv6 currentReachabilityStatus]; 

El estado de manejo es el mismo

 if (ReachableViaWiFi == s1) return @"WiFi"; //@"WLAN" if (ReachableViaWWAN == s1) return @"Cellular"; //@"WWAN" return @"None"; 

Siga este enlace, tiene un código fuente muy útil y los pasos https://github.com/tonymillion/Reachability . Esto le proporciona información acerca de cómo puede usar diferentes métodos en la posibilidad de jugar.

Agregue system.configuration.framewok, y también agregue los archivos Reachability.m y Reachability.h a su proyecto. allí después de usar métodos como

 +(instancetype)reachabilityWithHostName:(NSString*)hostname; +(instancetype)reachabilityForInternetConnection; +(instancetype)reachabilityWithAddress:(void *)hostAddress; +(instancetype)reachabilityForLocalWiFi; 

Fragmento de ejemplo:

 - (void)CheckConnection { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"]; reach.reachableBlock = ^(Reachability * reachability) { dispatch_async(dispatch_get_main_queue(), ^{ _blockLabel.stringValue = @"Block Says Reachable"; }); }; reach.unreachableBlock = ^(Reachability * reachability) { dispatch_async(dispatch_get_main_queue(), ^{ _blockLabel.stringValue = @"Block Says Unreachable"; }); }; [reach startNotifier]; } 

Espero que esto ayude

solo importar clases de Accesibilidad y después de eso

 -(BOOL) connectedToNetwork { const char *host_name = "www.google.com"; BOOL _isDataSourceAvailable = NO; Boolean success; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,host_name); SCNetworkReachabilityFlags flags; success = SCNetworkReachabilityGetFlags(reachability, &flags); _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); CFRelease(reachability); return _isDataSourceAvailable; } 

Consulte el siguiente código para verificar Internet Connectivity :

 struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; // Recover reachability flags SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddress); SCNetworkReachabilityFlags flags; BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); CFRelease(defaultRouteReachability); if (!didRetrieveFlags) { return 0; } BOOL isReachable = flags & kSCNetworkFlagsReachable; BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; NSURL *testURL = [NSURL URLWithString:@"http://www.google.com/"]; NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0]; NSURLResponse *response = nil; NSError *error = nil; NSData *connectiondata = [NSURLConnection sendSynchronousRequest:testRequest returningResponse:&response BOOL connection=NO; if ([connectiondata length] > 0 && error == nil){ NSLog(@"Connection present” ); connection=YES; } else { NSLog(@"No Connection" ); connection=NO; } return ((isReachable && !needsConnection) || nonWiFi) ? (connection ? YES : NO) : NO; 

El método más simple (una vez que haya agregado Accesibilidad a su proyecto):

 Reachability *reachability = [Reachability reachabilityForInternetConnection]; if (reachability.isReachable) { NSLog(@"We have internet!"); } else { NSLog(@"No internet!"); } 
    Intereting Posts