2012-07-01 16 views
16

scaricato raggiungibilità da parte di Apple, utilizzando questo metodo per verificare la presenza di una connessione attiva:raggiungibilità non funziona come previsto

-(BOOL)isReachable{ 

    Reachability *r = [Reachability reachabilityWithHostName:@"http://www.google.com"]; 

    if(NotReachable == [r currentReachabilityStatus]) { 
     NSLog(@"Not Reachable"); 
     return NO; 
    } 

    NSLog(@"Reachable"); 
    return YES; 

} 

non ha prodotto alcun ogni volta, pur essendo collegato? Non riesco a capire perché ...

Qualche idea? Grazie.

Su una nota a margine, qualcuno può raccomandare una classe di singleton Riacquisibilità?

risposta

30

CURA: è necessario rimuovere il protocollo, http dal reachabilityWithHostName chiamata, in modo aggiornati a

Reachability *reachability = [Reachability reachabilityWithHostname:@"www.google.com"]; 
NetworkStatus netStatus = [reachability currentReachabilityStatus]; 
+1

Yeh ho già fatto e hanno i bit di notifica multa di lavoro. Voglio un metodo che controlli lo stato di raggiungibilità prima di eseguire determinate attività (come il download di prodotti di acquisto in-app) –

+0

@AdamWaite scusa ho fatto un errore prima, ho aggiornato la domanda –

+0

Eccellente, questo ha fatto il trucco. Grazie. –

1

io uso KSReachability. Funziona con NSNotification, blocchi, KVO e con o senza ARC.

KSReachability *reachability = [KSReachability reachabilityToHost:@"www.google.com"]; 
reachability.onReachabilityChanged = ^(KSReachability* reachability) { 
    NSLog(@"Update: network is %@", reachability.reachable ? @"up." : @"down."); 
}; 
1

Se si sta tentando di vedere se il dispositivo può raggiungere Internet in generale, probabilmente si dovrebbe usare reachabilityForInternetConnection invece di reachabilityWithHostName :. Inoltre, entrambe le chiamate richiederanno un po 'di tempo per l'avvio (sarà ancora in millisecondi ma più lunga del tempo necessario per raggiungere la condizione if sulla riga successiva.) Ecco un esempio di una classe singleton che usa la raggiungibilità.

static NetworkManager* sharedInstance = nil; 

@interface NetworkManager() 
@property (nonatomic, strong) Reachability* reachability; 
@end 

@implementation NetworkManager 
@synthesize reachability; 

+ (NetworkManager*)sharedInstance 
{ 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [[NetworkManager alloc] init]; 
     } 
    } 
    return sharedInstance; 
} 

- (id)init 
{ 
    reachability = [WYReachability reachabilityForInternetConnection]; 
} 

- (BOOL)isNetworkReachable 
{ 
    return ([self.reachability currentReachabilityStatus] != NotReachable); 
} 
@end 

Per verificare la rete raggiungibile in altre classi è possibile utilizzare.

[[NetworkManager sharedInstance] isNetworkReachable]; 
5

Usa questo codice per verificare se il dispositivo è collegato a internet o no

uso questo codice in viewDidLoad:

Reachability* internetReachable; = [Reachability reachabilityForInternetConnection]; 
    [internetReachable startNotifier]; 

    hostReachable = [Reachability reachabilityWithHostName: @"www.apple.com"] ; 
    [hostReachable startNotifier]; 

e aggiungere questa funzione al codice:

-(void) checkNetworkStatus:(NSNotification *)notice 
{ 
    recheabilityBool=FALSE; 
    nonrecheabilityBool=FALSE; 
    // called after network status changes 
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    switch (internetStatus) 
    { 
     case NotReachable: 
     { 
      nonrecheabilityBool=TRUE; 
      internetCon=0; 
      //NSLog(@"The internet is down."); 


      break; 
     } 
     case ReachableViaWiFi: 
     { 
      NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
      internetCon=404; 
      [prefs setInteger:internetCon forKey:@"conKey"]; 

      //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: 
     { 
      internetCon=0; 
      if(nonrecheabilityBool==FALSE) 
      { 
       //NSLog(@"A gateway to the host server is down."); 
      } 
      break; 

     } 
     case ReachableViaWiFi: 
     { 
      if(recheabilityBool==FALSE) 
      { 

       recheabilityBool=TRUE; 

       NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
       internetCon=404; 
       [prefs setInteger:internetCon forKey:@"conKey"]; 


       //NSLog(@"The internet is working via WIFI."); 
       break; 
      } 


      //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; 
     } 
    } 
} 


- (BOOL)connected 
{ 
    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus networkStatus = [reachability currentReachabilityStatus]; 
    return !(networkStatus == NotReachable); 
} 
2

Ho lo stesso problema con la Raggiungibilità di Tony Million: lo stato della rete era sempre impostato su No tReachable. posso risolvere il problema con l'aggiunta del SystemConfiguration quadro

Speranza che aiuta

+0

Questo aiuta a risolvere il mio caso, ma questo dovrebbe essere messo in commento – Raptor

0

Un'altra risposta completa:

-(BOOL) isReachable:(NSString *)url 
{ 
    //Retrieve the host name by given url address. 
    NSString *hostName = [[NSURL URLWithString:url] host]; 
    Reachability *r = [Reachability reachabilityWithHostName:hostName]; 

    if(NotReachable == [r currentReachabilityStatus]) { 
     NSLog(@"Not Reachable"); 
     return NO; 
    } 
    NSLog(@"Reachable"); 
    return YES; 
} 
+0

Sta funzionando bene a prima volta. Devo controllare la raggiungibilità dell'host su ogni azione. Ma, torna sempre Raggiungibile tramite Wifi. Non l'host raggiungibile o no. –

+0

come da file di classe Reachbilty di Apple, 'Reachability non può dire all'applicazione se è possibile connettersi a un particolare host, solo che è disponibile un'interfaccia che potrebbe consentire una connessione e se tale interfaccia sia WWAN. [Apple Reachbilty] (https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2) –

Problemi correlati