2011-10-02 12 views
5

Necesito determinar si la conexión a internet está disponible o no. No me importa cómo está conectado (WI-FI, Lan, etc.). Necesito determinar si la conexión a Internet está disponible.Cómo determinar la conexión a Internet en Cocoa?

P.S. Encontré una manera de verificar la conexión WI-FI. Pero no me importa cómo está conectado (necesito verificar todas las formas en que se puede conectar a Internet).

Algo así como (isConnected)

+1

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

+0

Es realmente ni duplicado. ese enlace es más acerca de la conexión a Internet de Iphone. Y solo para Wi-Fi. – User1234

+0

@ User1234: ¿Qué te lleva a creer que la persona que pregunta preguntó sobre el iPhone o Wi-Fi? –

Respuesta

8

Tome un vistazo a la referencia SCNetworkReachability. Esta es una API de C, por lo que no es tan fácil de usar como una sola llamada a un método, pero hace un gran trabajo al notificar a su aplicación cuando una dirección particular es accesible o inalcanzable a través de la red.

El esquema general es que creará un objeto con SCNetworkReachabilityCreateWithAddress o SCNetworkReachabilityCreateWithName, y luego lo agregará al ciclo de ejecución con SCNetworkReachabilityScheduleWithRunLoop. Cuando se determina la accesibilidad y cuando cambia, se llamará a la función de devolución de llamada que usted suministra. Puede usar eso para actualizar el estado de su aplicación.

de Apple suministra an example app que muestra cómo utilizar esto (aunque está diseñado para iOS, no Mac OS X)

+0

Gracias mucho fue interesante conocer. Pero lo necesito para MAC OS. Creo que debería haber algo más simple de usar. Quiero verificar si estoy conectado a INternet -hacer algo. Me gusta (ifConnected) {// do here} – User1234

+2

Está disponible en Mac OS X (la documentación vinculada es de la biblioteca Mac OS X). El ejemplo simplemente está escrito para iOS. No hay un método 'isConnected' proporcionado por el sistema. Pero puede usar esto para escribir su propio método 'isConnected'. – Alex

+0

Ok gracias lo intentaré. – User1234

3

Una forma de hacerlo es la siguiente:

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

Hace exactamente lo que quiero. Gracias. – User1234

+0

¡Ningún problema! Gracias por el voto popular! – Fatso

+6

Esta es una mala solución. Su aplicación se congelará hasta que la solicitud tenga éxito o falle. Esto podría causar que su aplicación se bloquee durante hasta 60 segundos si tienen un problema de enrutamiento que hace que la solicitud no falle hasta que se alcanza el tiempo de espera. Su usuario no apreciará esto. Incluso si tiene éxito, la aplicación probablemente se parará durante varios segundos, especialmente a través de una conexión lenta. – Alex

7

Este código funciona tanto para iOS y Plataformas OSX, espero.

#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

¡Esta debería ser la respuesta! ¡Gracias! – rocky

+0

¿Alguien más lo ha probado? – bgplaya

+0

He probado esto y funciona muy bien. – Mike

Cuestiones relacionadas