Comprobación de la conectividad a Internet en el objective C

He estado trabajando en el curso de código de iPhone de Stanford y actualmente estoy conectado a 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 otro para cuando el dispositivo no está conectado actualmente a Internet. Lamentablemente, tal y como está, lo mejor que puedo suponer es si el retorno de la API es o no nulo o no, como ocurre en ambas condiciones.

Lo que estoy buscando es una línea o dos de código que puedan verificar una connection antes de intentar get datos remotos. Podría revisar la documentation de Apple, pero pensé: ¿por qué no les pongo la pregunta a ustedes para mi beneficio y quizás para otros?

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

Eche un vistazo al código de ejemplo de Apple. El proyecto Reachability muestra cómo detectar una connection.

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

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

La forma en que funciona la stack TCP en el iPhone es muy diferente de lo que debería esperarse. Con el código "Reachability", a veces estará presente una connection de networking, pero no se detectará de forma fiable. Sin embargo, al iniciar MobileSafari, volver a intentar comprobar la conectividad con el código "Reachability" resultará en el resultado correcto.

La forma en que he encontrado más eficaz para determinar la conectividad de networking es ejecutar una comprobación de NSURLConnection cuando la aplicación se carga, en un hilo separado. Haga una llamada a una URL que sabe que devolverá algo así como "Sí" (es decir, un file HTML en su server o algo así). Luego verifique que el resultado devuelto sea igual al text estático. De esa manera, sabes que la stack de NSURLConnection está llegando correctamente, en contraposition al código de "scope" que no funciona de forma coherente.

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

NSURLErrorUserCancelledAuthentication = -1012, 

aunque es evidente que la networkingacción es engañosa, aunque puedo replicar consistentemente colocando bad user / passwd y obteniendo ese código de error. Técnicamente, el iPhone nunca está conectado a Internet a less que se encuentre en una región extraña que tenga problemas con la connection de datos. Veo también que hay un código de error

 NSURLErrorNotConnectedToInternet = -1009, 

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

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

etc …

todo lo que necesitas hacer es get una reference al object NSError que pasaste y comprobar que es un código de error como

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

esto funciona para mí y se toma del proyecto xml sísmico de manzana:

 - (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 & kSCNetworkFlagsConnectionRequinetworking); CFRelease(reachability); } return _isDataSourceAvailable; } 

La accesibilidad es una class separada a través de la que 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: { } } 

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

Cuando use Apple's Reachability tenga en count que puede encontrarse conectado a través de WWAN (ReachableViaWWAN) o WiFi (ReachableViaWiFi) sin estar conectado a Internet, incluso cuando intenta llegar a algún host como google.com o apple.com (tal vez un almacenamiento en caching problema). Terminé de llamar a mi propio server y recuperar un dígito, la mejor solución en mi caso al less.

 -(BOOL)returnInternetConnectionStatus{ ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection]; NetworkStatus internetStatus = [reach currentReachabilityStatus]; if ((internetStatus != NotReachable)) { return TRUE; } else { return FALSE; } }