Comprobación de la conectividad de Internet en el objetivo C

votos
15

He estado trabajando en el curso de Codificación de iPhone de Stanford y actualmente me estoy conectando con la API de Twitter. Lo que me gustaría hacer es manejar con precisión dos condiciones de error: una para cuando el nombre de usuario no es válido y otra para cuando el dispositivo no está actualmente conectado a internet. Desafortunadamente, tal como está, lo mejor que puedo suponer es si el retorno de la API es nulo o no, cuál es el caso para ambas condiciones.

Lo que busco es una o dos líneas de código que puedan verificar la conexión antes de intentar obtener datos remotos. Pude ver la documentación de Apple pero pensé: ¿por qué no les hago la pregunta a ustedes para mi beneficio y tal vez el de los demás?

Información adicional: usando Objective-C y el iPhone SDK en XCode.

Publicado el 25/01/2009 a las 16:53
fuente por usuario
En otros idiomas...                            


8 respuestas

votos
30

Eche un vistazo al código de muestra de Apple. El proyecto de Accesibilidad muestra cómo detectar una conexión.

http://developer.apple.com/iphone/library/samplecode/Reachability/index.html

Respondida el 25/01/2009 a las 17:35
fuente por usuario

votos
9

Ese código funciona, pero no siempre crea el resultado deseado.

La forma en que funciona la pila TCP en el iPhone es muy diferente de lo que debería esperarse. Con el código de "Accesibilidad", algunas veces habrá una conexión de red, pero no se detectará de manera confiable. Sin embargo, al iniciar MobileSafari, luego volver a intentar verificar la conectividad con el código de "Accesibilidad" dará como resultado el resultado correcto.

La forma que he encontrado más efectiva para determinar la conectividad de red es ejecutar una verificación de NSURLConnection cuando la aplicación se carga, en un hilo separado. Haga una llamada a una URL que sepa que devolverá algo como "Sí" (es decir, archivo HTML en su servidor o algo así). Luego verifique para asegurarse de que el resultado devuelto sea igual al texto estático. De esta forma, usted sabe que la pila de NSURLConnection se está comunicando correctamente, a diferencia del código de "Accesibilidad" que no funciona de manera consistente.

Respondida el 10/05/2009 a las 05:45
fuente por usuario

votos
9

Tendrá que leer los códigos de error y responder lo mejor que pueda. He tenido algo de experiencia con esto, en esencia, puede depender del servicio con el que estés interactuando, pero con delicious.com recibo el error -1012 para el usuario malo / passwd, que si lo buscas es

NSURLErrorUserCancelledAuthentication =     -1012,

aunque es evidente que la redacción es engañosa, aunque puedo replicar consistentemente poner mal usuario / passwd y obtener ese código de error. Técnicamente, el iPhone nunca está conectado a Internet a menos que se encuentre en alguna región extraña que tenga problemas con la conexión de datos. Veo también que hay un código de error

NSURLErrorNotConnectedToInternet =      -1009,

Pasaría por NSURLError.h (y hay más como eso)

NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,

etc ...

todo lo que necesita hacer es obtener una referencia al objeto NSError que pasó y comprobar que es un código de error como ese

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

la constante es algo que he definido en mi propio código fuente que es esencialmente -1012

Respondida el 25/01/2009 a las 17:31
fuente por usuario

votos
8

esto funciona para mí y está tomado del proyecto apple sísmico xml:

- (BOOL)isDataSourceAvailable
{
    static BOOL checkNetwork = YES;
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
        checkNetwork = NO;

        Boolean success;    
        const char *host_name = "twitter.com"; // your data source host name

        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
    }
    return _isDataSourceAvailable;
}
Respondida el 26/03/2009 a las 16:18
fuente por usuario

votos
3

La accesibilidad es clase separada a través de usted puede acceder al código

   Reachability *curReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus)
{
    case NotReachable:
    {
        UIAlertView *connectionAlert = [[UIAlertView alloc] init];
        [connectionAlert setTitle:@"Error"];
        [connectionAlert setMessage:@"Please check your network connection."];
        [connectionAlert setDelegate:self];
        [connectionAlert setTag:1];
        [connectionAlert addButtonWithTitle:@"Back"];
        [connectionAlert show];

        break;
    }
    case ReachableViaWWAN:
    {


    }
    case ReachableViaWiFi:
    {
    }
}
Respondida el 20/08/2013 a las 06:40
fuente por usuario

votos
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Respondida el 14/08/2012 a las 07:40
fuente por usuario

votos
2

Al utilizar oso de accesibilidad de Apple en cuenta que puede que se encuentre estando conectados a través de WWAN (ReachableViaWWAN) o WiFi (ReachableViaWiFi) sin estar conectado a Internet, incluso cuando intenta llegar a algún huésped como google.com o apple.com (tal vez un almacenamiento en caché problema). Terminé llamar a mi propio servidor y volver a un dígito - la mejor solución en mi caso al menos.

Respondida el 18/05/2011 a las 11:40
fuente por usuario

votos
2

¿Cómo es tu código de conexión actual? Si está usando NSURLConnection +sendSynchronousRequest:returningResponse:error:, solo necesita pasar la dirección de una variable NSError y comprobar que a partir de entonces; con connectionWithRequest:delegate:, deberías implementar -connection:didFailWithError:en el delegado.

Respondida el 25/01/2009 a las 16:59
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more