2012-07-01 26 views
16

Pobrane osiągalności od Apple, za pomocą tej metody, aby sprawdzić aktywnego połączenia:osiągalności nie działa zgodnie z oczekiwaniami

-(BOOL)isReachable{ 

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

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

    NSLog(@"Reachable"); 
    return YES; 

} 

nie zwraca za każdym razem mimo podłączony? Nie mogę zrozumieć, dlaczego ...

Jakieś pomysły? Dzięki.

Na marginesie, czy ktoś może polecić dobrą czystą klasę singleton?

Odpowiedz

30

edycja: należy usunąć protokół, http od rozmowy reachabilityWithHostName, więc zaktualizowane go

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

Yeh już robiłem to i mają bity powiadomień pracy grzywny. Chcę, aby metoda sprawdzania stanu osiągalności przed wykonaniem pewnych zadań (takich jak pobieranie produktów zakupu aplikacji) –

+0

@AdamWaite Przepraszam, że popełniłem błąd wcześniej, mam zaktualizowane pytanie –

+0

Doskonałe, to załatwiło sprawę. Dzięki. –

1

używam KSReachability. Działa z NSNotification, blokami, KVO iz ARC lub bez ARC.

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

Jeśli chcesz sprawdzić, czy urządzenie może dotrzeć do internetu w ogóle powinieneś używać reachabilityForInternetConnection zamiast reachabilityWithHostName :. Ponadto uruchomienie obu tych dwóch połączeń zajmie trochę czasu (pozostanie w milisekundach, ale będzie dłuższy niż czas potrzebny do osiągnięcia warunku if w następnym wierszu). Oto przykład klasy pojedynczej, która wykorzystuje osiągalność.

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 

Aby sprawdzić dostępność sieci w innych klasach, możesz użyć.

[[NetworkManager sharedInstance] isNetworkReachable]; 
5

użyć tego kodu, aby sprawdzić, czy urządzenie jest podłączone do internetu lub nie

użyć tego kodu w viewDidLoad:

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

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

i dodać tę funkcję do kodu:

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

Mam taki sam problem z osiągnięciem Tony'ego Milliona: status sieci zawsze był ustawiony na Nie tDostępny. naprawić je dodając SystemConfiguration ramowa

Nadzieja pomaga

+0

Pomaga to w rozwiązaniu mojej sprawy, ale należy to skomentować – Raptor

0

Kolejna kompletna odpowiedź:

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

Działa poprawnie na pierwszym razem. Muszę sprawdzić osiągalność hosta przy każdym działaniu. Ale zawsze zwracaj się do Reachable przez Wi-Fi. Nie hosta osiągalny, czy nie. –

+0

jak na plik klasy Reachbilty firmy Apple, 'Zasięg możliwości nie może powiedzieć twojej aplikacji, jeśli możesz połączyć się z określonym hostem, tylko że dostępny jest interfejs, który może zezwalać na połączenie i czy ten interfejs jest WWAN. [Apple Reachbilty] (https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2) –

Powiązane problemy