2012-07-01 25 views
16

Heruntergeladene Erreichbarkeits von Apple, mit dieser Methode für eine aktive Verbindung zu überprüfen:Erreichbarkeits funktioniert nicht wie erwartet

-(BOOL)isReachable{ 

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

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

    NSLog(@"Reachable"); 
    return YES; 

} 

Returns NO jedes Mal trotz verbunden ist? Kann nicht herausfinden, warum ...

Irgendwelche Ideen? Vielen Dank.

Nebenbei bemerkt, kann jemand eine gute saubere Singleton Klasse empfehlen?

Antwort

30

EDITED: sollten Sie das Protokoll entfernen, http von Ihrem reachabilityWithHostName Anruf, es ist so aktualisiert

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

Yeh habe ich das schon getan und haben die Meldebits adaequat. Ich möchte eine Methode, die den Erreichbarkeitsstatus überprüft, bevor Sie bestimmte Aufgaben ausführen (z. B. Herunterladen von In-App-Kauf-Produkten). –

+0

@AdamWaite Tut mir leid, ich habe einen Fehler gemacht, ich habe die Frage aktualisiert –

+0

Ausgezeichnet, das hat den Trick. Vielen Dank. –

1

I KSReachability verwenden. Es funktioniert mit NSNotification, Blöcken, KVO und mit oder ohne ARC.

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

Wenn Sie sehen wollen, ob das Gerät das Internet im Allgemeinen erreichen, können Sie wahrscheinlich reachabilityForInternetConnection statt reachabilityWithHostName verwenden sollten :. Außerdem benötigen beide Aufrufe ein wenig Zeit zum Starten (sie liegen immer noch in Millisekunden, aber länger als die Zeit, die benötigt wird, um die if-Bedingung in der nächsten Zeile zu erreichen.) Hier ist ein Beispiel für eine Singleton-Klasse verwendet Erreichbarkeit.

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 

Um zu überprüfen, ob das Netzwerk in anderen Klassen erreichbar ist, die Sie verwenden können.

[[NetworkManager sharedInstance] isNetworkReachable]; 
5

Mit diesem Code zu überprüfen, ob das Gerät mit dem Internet oder nicht

Verwendung dieser Code in viewDidLoad verbunden ist:

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

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

und fügen Sie diese Funktion, um Ihren Code:

-(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

Ich habe ein ähnliches Problem mit der Erreichbarkeit von Tony Million: Netzwerkstatus wurde immer auf Nein gesetzt Erreichbar. Ich fixiere es mit dem Hinzufügen der Systemconfiguration Rahmen

Hope it

+0

Dies hilft bei der Lösung meines Falles, aber das sollte in Kommentar – Raptor

0

Eine weitere vollständige Antwort hilft:

-(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

Es funktioniert gut auf Anhieb. Ich muss die Erreichbarkeit des Hosts bei jeder Aktion überprüfen. Aber, immer wieder erreichbar über Wifi. Nicht der Host erreichbar oder nicht. –

+0

Laut Reachbilty-Klassendatei von Apple, 'Erreichbarkeit kann Ihre Anwendung nicht sagen, wenn Sie eine Verbindung zu einem bestimmten Host herstellen können, nur dass eine Schnittstelle verfügbar ist, die eine Verbindung zulassen könnte, und ob diese Schnittstelle der WWAN ist." [Apple Reachbilty] (https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2) –

Verwandte Themen