2012-11-16 14 views
10

Sto utilizzando il codice di raggiungibilità di Apple e sto configurando entrambe le notifiche iniziali su quando la raggiungibilità della rete cambia e prima di avviare una connessione al server. Il codice funziona quando sono su Wi-Fi e spengo il punto di accesso Wi-Fi. Tuttavia, quando avviò l'app con wi-fi e la connessione a banda larga sottostante funzionante, e poi una volta che l'app è in esecuzione, quindi disconnetti il ​​router wi-fi dal router a banda larga (ad es. Il Wi-Fi è acceso ma non c'è internet connettività), e faccio un controllo di raggiungibilità, lo stato della rete che ottengo è ReachableViaWiFi. Ho provato sia la reachabilityForInternetConnection che la raggiungibilitàWithHostName.Raggiungibilità non funzionante quando wi-fi collegato ma non internet

Qualche idea su se il codice di raggiungibilità di Apple può essere utilizzato per rilevare una situazione in cui il wifi è connesso ma non c'è una connessione di rete sottostante?

Grazie!

risposta

5

ok, ho trovato la risposta a questo: la raggiungibilità di Apple non verifica la connettività effettiva all'host. Vedere la risposta @Zhami nel link qui sotto SO:

How to write a simple Ping method in Cocoa/Objective-C

In sostanza, quando si avvia prima l'applicazione e fare un controllo di raggiungibilità, iOS sembra di fare una ricerca DNS, e se non c'è internet, il controllo fallisce. Quindi, la prima volta che controlli la raggiungibilità, in realtà restituisce un valore significativo. Tuttavia, se vieni connesso all'avvio dell'app e perdi la connettività Internet dopo un po 'di tempo (pur essendo ancora connesso a WiFi/3G/4G ma senza connettività Internet sottostante), ulteriori verifiche di raggiungibilità sono raggiungibili anche se Internet o l'host specificato non sono raggiungibili più.

Quindi, se si desidera controllare veramente per la connettività in tempo reale, è possibile utilizzare il seguente:

-(BOOL) isConnected 
{ 

    NSString* url = [NSURL URLWithString:@"http://www.google.com/m"]; 
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; 
    [request setTimeOutSeconds:10]; 
//customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long 
    [request setNumberOfTimesToRetryOnTimeout:0]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (error) 
    { 
     DLog(@"connectivity error"); 
     return NO; 
    } 
    else 
    { 
     DLog(@"connectivity OK"); 
     return YES; 
    } 

} 
+0

questo non funziona ... – user3079872

+0

funzionerà, quando controllerò se internet è disponibile o meno. Come ascoltare e mostrare automaticamente una rete non disponibile immediatamente, mentre internet è disconnesso? – NandhaKumar

1

Questo è un post molto vecchio, ma potrebbe rimanere qui per riferimento. Nell'esempio di classe raggiungibilità è possibile trovare il codice qui sotto:

- (BOOL)startNotifier 
{ 
    BOOL returnValue = NO; 
    SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; 

    if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) 
    { 
     if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) 
     { 
      returnValue = YES; 
     } 
    } 

    return returnValue; 
} 

Ciò manterrà la vostra _reachabilityRef aggiornato ai cambiamenti della rete.

Problemi correlati