2014-05-13 15 views
5

Sto utilizzando AFNetworking e mi chiedevo come rilevare uno scenario quando l'utente è connesso a una rete wifi senza connessione Internet attiva.AFNetworking rileva quando la connessione Wi-Fi senza connessione Internet attiva

Riproduco questo scenario acquistare un router senza collegare la linea dsl.

AFNetworking return AFNetworkReachabilityStatusReachableViaWiFi = 2 

il mio codice:

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
     NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 
     self.isInternetAvialable = status > 0; 
    }]; 

grazie

ho refacotred il codice per essere come

AFNetworkReachabilityManager* manager = [AFNetworkReachabilityManager managerForDomain:@"http://www.google.com"]; 
     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
      NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 
      self.isInternetAvialable = status > 0; 
     }]; 
     [manager startMonitoring]; 

ora il blocco non vengono mai chiamato!

+0

ha la risposta accettata lavorato per voi ?? – SandeepAggarwal

risposta

2

Invece di utilizzare [AFNetworkReachabilityManager sharedManager] che controlla solo la connettività di rete, è possibile utilizzare [AFNetworkReachabilityManager managerForDomain:(NSString *)domain] e passa un nome host appropriato, ad esempio "www.google.com": in questo modo è possibile verificare se il la rete a cui sei connesso ha accesso a Internet - può ancora essere ingannato dal DNS locale e da un server web, ma penso che sia improbabile che qualcuno lo faccia.

Una volta ottenuto il AFNetworkReachabilityManager è possibile impostare il blocco di cambiamento come si fa per il manager condiviso

+0

Ehi, per favore controlla il mio post originale edit – ibm123

+0

Quanto tempo hai aspettato? Potrebbe volerci un po 'di tempo per fallire a causa del timeout del DNS. Puoi anche provare un host ben noto come 8.8.8.8 per evitare la ricerca DNS – Paulw11

1

Utilizzare la classe Reachability e il relativo metodo reachabilityForInternetConnection.

Reachability *networkReachability = [Reachability reachabilityForInternetConnection]; 
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];  

if (networkStatus == NotReachable) 
{   
    NSLog(@"There is NO Internet connection");   
} 
else 
{   
    NSLog(@"There is Internet connection");   
} 
0

Passare alla classe Reachability di Apple. Ha tutte le funzioni di cui hai bisogno. La soluzione migliore è utilizzare un dominio (come Google) per verificare la reale connettività Internet.

codice di esempio illustrati:

Add osservatore didFinishLaunchingWithOptions:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(checkNetworkStatus:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

internetReachable = [[Reachability reachabilityForInternetConnection] retain]; 

[internetReachable startNotifier]; 

// check if a pathway to a random host exists 

hostReachable = [Reachability reachabilityWithHostname:@"SOME_HOST"]; 

[hostReachable startNotifier]; 

Poi, nel metodo di destinazione:

- (void) checkNetworkStatus:(NSNotification *)notice { 

NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 

switch (internetStatus) 
{ 
    case NotReachable: 
    { 
     NSLog(@"The internet is down."); 

     break; 
    } 
    case ReachableViaWiFi: 
    { 
     NSLog(@"The internet is working via WIFI."); 

     break; 
    } 
    case ReachableViaWWAN: 
    { 
     NSLog(@"The internet is working via WWAN."); 

     break; 
    } 
} 

NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; 

switch (hostStatus) 
{ 
    case NotReachable: 
    { 
     NSLog(@"A gateway to the host server is down."); 

     break; 
    } 
    case ReachableViaWiFi: 
    { 
     NSLog(@"A gateway to the host server is working via WIFI."); 

     break; 
    } 
    case ReachableViaWWAN: 
    { 
     NSLog(@"A gateway to the host server is working via WWAN."); 

     break; 
    } 
} 
} 
+0

Sfortunatamente la Raggiungibilità di Apple in realtà non ti dice se può connettersi a un host, solo se _could_ si connette a uno. Secondo la loro nota: 'Nota: Raggiungibilità non può dire all'applicazione se è possibile connettersi a un particolare host, solo che è disponibile un'interfaccia che potrebbe consentire una connessione e se questa sia l'interfaccia WWAN. È possibile verificare questo scollegando il Internet dal tuo router WiFi. Raggiungibilità dirà comunque che Google è raggiungibile fintanto che il dispositivo è connesso al WiFi. – jeffjv

Problemi correlati