2011-10-02 11 views
5

Muszę ustalić, czy połączenie internetowe jest dostępne, czy nie. Nie obchodzi mnie jak jest podłączony (WI-FI, LAN, itp.). Muszę stwierdzić, czy w ogóle dostępne jest połączenie z Internetem.Jak określić połączenie internetowe w kakao?

P.S. Znalazłem sposób sprawdzenia połączenia WI-FI. Ale nie obchodzi mnie, jak to jest połączone (muszę sprawdzić wszystkie sposoby, które można podłączyć do Internetu).

Coś (isconnected)

+1

Dupe od http://stackoverflow.com/questions/2995822/check-internet-connection-in-cocoa-application – bryanmac

+0

To naprawdę ani powielać. ten link jest więcej o Iphone Internet Connection. I tylko dla Wi-Fi. – User1234

+0

@ User1234: Co prowadzi do tego, że pytający pytał o iPhone'a lub Wi-Fi? –

Odpowiedz

8

Spójrz na odniesienie SCNetworkReachability. To jest API C, więc nie jest tak proste w użyciu, jak pojedyncze wywołanie metody, ale świetnie sprawdza się w powiadomieniu aplikacji, gdy dany adres staje się osiągalny lub nieosiągalny przez sieć.

Ogólny zarys polega na utworzeniu obiektu o numerze SCNetworkReachabilityCreateWithAddress lub SCNetworkReachabilityCreateWithName, a następnie dodanie go do pętli uruchamiania z SCNetworkReachabilityScheduleWithRunLoop. Po określeniu osiągalności i po jej zmianie wywoływana funkcja zwrotna zostanie wywołana. Możesz go użyć, aby zaktualizować stan swojej aplikacji.

Jabłko dostarcza an example app, który pokazuje, jak korzystać z tego (choć jest ono przeznaczone dla iOS, a nie Mac OS X)

+0

Bardzo dziękuję. Ale potrzebuję tego dla MAC OS. Myślę, że powinno być coś prostszego w użyciu. Chcę sprawdzić, czy jestem podłączony do INTERnet -do Something. Podobnie jak (ifConnected) {// do here} – User1234

+2

Jest to dostępne w systemie Mac OS X (połączona dokumentacja pochodzi z biblioteki Mac OS X). Przykład właśnie jest napisany na iOS. Nie ma dostarczanej przez system metody "isConnected". Ale możesz użyć tego do napisania własnej metody "isConnected". – Alex

+0

OK, dzięki, spróbuj. – User1234

3

Jednym ze sposobów na to jest:

// Check whether the user has internet 
- (bool)hasInternet { 
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.google.com"]; 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0]; 
    BOOL connectedToInternet = NO; 
    if ([NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]) { 
     connectedToInternet = YES; 
    } 
    //if (connectedToInternet) 
     //NSLog(@"We Have Internet!"); 
    [request release]; 
    [url release]; 
    return connectedToInternet; 
} 
+0

Dokładnie robi to, co chcę. Dzięki. – User1234

+0

Nie ma problemu! Dzięki za przegraną! – Fatso

+6

To jest złe rozwiązanie. Twoja aplikacja zostanie zablokowana do momentu pomyślnego zakończenia lub niepowodzenia żądania. Może to spowodować wstrzymanie działania aplikacji przez maksymalnie 60 sekund, jeśli wystąpi problem z routingiem, który powoduje, że żądanie nie zakończy się niepowodzeniem, dopóki nie zostanie osiągnięty limit czasu. Twój użytkownik tego nie doceni. Nawet jeśli się powiedzie, aplikacja prawdopodobnie zatrzyma się na kilka sekund, szczególnie w przypadku powolnego połączenia. – Alex

7

Ten kod działa dla obu iOS i Mam nadzieję, że platformy OSX.

#include <SystemConfiguration/SystemConfiguration.h> 
static BOOL isInternetConnection() 
{ 
    BOOL returnValue = NO; 

#ifdef TARGET_OS_MAC 

    struct sockaddr zeroAddress; 
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sa_len = sizeof(zeroAddress); 
    zeroAddress.sa_family = AF_INET; 

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


#elif TARGET_OS_IPHONE 

    struct sockaddr_in address; 
    size_t address_len = sizeof(address); 
    memset(&address, 0, address_len); 
    address.sin_len = address_len; 
    address.sin_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&address); 

#endif 

    if (reachabilityRef != NULL) 
    { 
     SCNetworkReachabilityFlags flags = 0; 

     if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) 
     { 
      BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0); 
      BOOL connectionRequired = ((flags & kSCNetworkFlagsConnectionRequired) != 0); 
      returnValue = (isReachable && !connectionRequired) ? YES : NO; 
     } 

     CFRelease(reachabilityRef); 
    } 

    return returnValue; 

} 
+0

To powinna być odpowiedź! Dziękuję Ci! – rocky

+0

Czy ktoś inny to przetestował? – bgplaya

+0

Testowałem to i działa świetnie. – Mike

Powiązane problemy