2012-12-06 14 views

Odpowiedz

35

Najlepszym sposobem jest użycie kodu zasięgu. Sprawdź here for apple sample code. Że ma wiele wygodnych sposobów, aby sprawdzić dostępność internetu, internet/WAN łączności czek etc ..

Dla np: -

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

reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 

- (void)networkChanged:(NSNotification *)notification 
{ 

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) { NSLog(@"not reachable");} 
    else if (remoteHostStatus == ReachableViaWiFiNetwork) { NSLog(@"wifi"); } 
    else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { NSLog(@"carrier"); } 
} 
+3

Skąd wiadomo, kto poniósł szkodę? Przy okazji .. +1 za odpowiedź :) – TonyMkenu

+1

'ReachableViaCarrierDataNetwork' &' ReachableViaWiFiNetwork 'nie są dostępne, status może być' ReachableViaWWAN' lub 'ReachableViaWiFi'. – Hemang

+0

po wyświetleniu tylko powiadomienia, ale trzeba przed zmianą sieci. jak zdobyć dostępną sieć, gdy wywoływana jest metoda viewdidload. – Bala

10

Spróbuj kod:

- (BOOL)connectedToInternet 
{ 
    NSURL *url=[NSURL URLWithString:@"http://www.google.com"]; 
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"HEAD"]; 
    NSHTTPURLResponse *response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; 

    return ([response statusCode]==200)?YES:NO; 
} 
11

osiągalności ma wiele bardziej do niego niż potrzebuje, a także nie został jeszcze zaktualizowany dla ARC.

Oto moje rozwiązanie w czystym C. Duża część kodu została pobrana bezpośrednio z Reachability, ale oddestylowana do poziomu tylko tego, co jest konieczne. Chciałem tylko, aby zwrócił, czy było połączenie internetowe, czy nie, ale możesz przeczytać z komentarzy, czy powraca TAK w oparciu o założenie sieci Wi-Fi lub sieci komórkowej.

Jedna ostatnia uwaga przed przystąpieniem do udostępnienia kodu: Musisz przejść do celu budowy, wybrać zakładkę fazy budowania i dodać "SystemConfiguration.framework" do listy "Link Binary z bibliotekami".

#import <CoreFoundation/CoreFoundation.h> 
#import <SystemConfiguration/SystemConfiguration.h> 
#import <netdb.h> 

BOOL networkReachable() 
{ 
    struct sockaddr_in zeroAddress; 
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sin_len = sizeof(zeroAddress); 
    zeroAddress.sin_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress); 

    SCNetworkReachabilityFlags flags; 
    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) { 
     if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { 
      // if target host is not reachable 
      return NO; 
     } 

     if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { 
      // if target host is reachable and no connection is required 
      // then we'll assume (for now) that your on Wi-Fi 
      return YES; // This is a wifi connection. 
     } 


     if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand) != 0) 
      ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { 
      // ... and the connection is on-demand (or on-traffic) if the 
      //  calling application is using the CFSocketStream or higher APIs 

      if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { 
       // ... and no [user] intervention is needed 
       return YES; // This is a wifi connection. 
      } 
     } 

     if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) { 
      // ... but WWAN connections are OK if the calling application 
      //  is using the CFNetwork (CFSocketStream?) APIs. 
      return YES; // This is a cellular connection. 
     } 
    } 

    return NO; 
} 
+0

Bardzo lubię twoje rozwiązanie, ale osobiście zrobię małą modyfikację. Myślę, że zamiast zwracać BOOL, powinieneś zwrócić stały lub ENUM element, abyśmy mogli określić, czy istnieje połączenie i jakiego typu. Na szczęście ta modyfikacja nie jest trudna do zrobienia! –

+1

Wierzę, że popełniłem tu błąd i że ten kod przecieka. SCNetworkReachabilityRef musi zostać wysłany do CFRelease() w pewnym momencie ... najlepszym sposobem na zrobienie tego może być wyrwanie SCNetworkReachabilityGetFlags() i zapisanie jego wartości, a następnie zwolnienie ref dostępności, następnie przejście do if i sprawdzenie zapisana wartość. W ten sposób pamięć zajmowana przez SCNetworkReachability przechowywana na stercie zostaje zwolniona, ale wszystko, czego potrzebujesz w tym momencie (flagi i wartość zwracana przez SCNetworkReachabilityGetFlags()) są nadal dostępne na stosie. – ArtOfWarfare

Powiązane problemy