objective-c - developer - twitter sdk android
ComprobaciĆ³n de la conectividad de Internet en el objetivo C (8)
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.
la accesibilidad es una clase separada a través de la cual se 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 es tu código de conexión 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.
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
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;
}
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 en que he encontrado más efectivo para determinar la conectividad de la 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.
Al usar la accesibilidad de Apple tenga en cuenta que puede encontrarse conectado a través de WWAN (ReachableViaWWAN) o WiFi (ReachableViaWiFi) sin estar conectado a Internet, incluso cuando intenta llegar a un host como google.com o apple.com (tal vez un almacenamiento en caché problema). Terminé llamando a mi propio servidor y obteniendo un dígito, la mejor solución en mi caso al menos.
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 necesitas hacer es obtener una referencia al objeto NSError que pasaste y verificar su código de error como tal
//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
-(BOOL)returnInternetConnectionStatus{
ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
NetworkStatus internetStatus = [reach currentReachabilityStatus];
if ((internetStatus != NotReachable)) {
return TRUE;
} else {
return FALSE;
}
}