2011-10-02 13 views
5

Devo determinare se Internet Connection è disponibile o meno. Non mi interessa come è collegato (WI-FI, Lan, ecc.). Ho bisogno di determinare, è disponibile la connessione a Internet.Come determinare la connessione Internet in Cocoa?

P.S. Ho trovato un modo per controllare la connessione WI-FI. Ma non mi interessa come è collegato (ho bisogno di controllare tutti i modi che possono essere collegati a Internet).

Qualcosa di simile (isConnected)

+1

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

+0

E 'davvero né duplicare. quel collegamento è più su Iphone Internet Connection. E solo per Wi-Fi. – User1234

+0

@ User1234: che cosa ti porta a credere che l'interlocutore stesse chiedendo l'iPhone o il Wi-Fi? –

risposta

8

Date un'occhiata al riferimento SCNetworkReachability. Questa è un'API C, quindi non è così facile da usare come una chiamata a un singolo metodo, ma fa un ottimo lavoro di notifica all'app quando un determinato indirizzo diventa raggiungibile o irraggiungibile sulla rete.

Lo schema generale è che verrà creato un oggetto con SCNetworkReachabilityCreateWithAddress o SCNetworkReachabilityCreateWithName e quindi aggiunto al ciclo di esecuzione con SCNetworkReachabilityScheduleWithRunLoop. Quando viene determinata la raggiungibilità e quando cambia, viene richiamata la funzione di callback che fornisci. Puoi usarlo per aggiornare lo stato della tua applicazione.

di Apple fornisce an example app che mostra come utilizzare questo (anche se è stato progettato per iOS, non Mac OS X)

+0

Grazie mille era interessante sapere. Ma ne ho bisogno per MAC OS. Penso che ci dovrebbe essere qualcosa di più semplice da usare. Voglio verificare se sono connesso a INternet -do Something. Mi piace (ifConnected) {// do here} – User1234

+2

Questo è disponibile su Mac OS X (la documentazione collegata è della libreria Mac OS X). L'esempio sembra essere scritto per iOS. Non esiste un metodo 'isConnected' fornito dal sistema. Ma puoi usare questo per scrivere il tuo metodo 'isConnected'. – Alex

+0

Ok, grazie proveremo. – User1234

3

Un modo per farlo è:

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

Fa esattamente quello che voglio. Grazie. – User1234

+0

Nessun problema! Grazie per l'upvote! – Fatso

+6

Questa è una pessima soluzione. L'applicazione si bloccherà fino a quando la richiesta avrà esito positivo o negativo. Ciò potrebbe causare il blocco dell'applicazione per un massimo di 60 secondi in caso di problemi di routing che causano il fallimento della richiesta fino al raggiungimento del timeout. Il tuo utente non apprezzerà questo. Anche se ha successo, l'applicazione probabilmente si bloccherà per diversi secondi, specialmente su una connessione lenta. – Alex

7

Questo codice funziona per entrambi iOS e Piattaforme OSX, spero.

#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

Questa dovrebbe essere la risposta! Grazie! – rocky

+0

Qualcun altro lo ha provato? – bgplaya

+0

Ho provato questo e funziona benissimo. – Mike

Problemi correlati