ios - Disponibilidad de comprobación de red
reachability ios (3)
He implementado AFNetworking
sin subclasificar AFHTTPClient
, en parte usando el siguiente código en mi DownloadQueueManager
:
-(void)downloadPodcastAt:(NSString *)url toPath:(NSString *)path
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestReturnCacheDataElseLoad
timeoutInterval:60.0];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
[self saveQueuedItemInformation];
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
// Other stuff
}];
[operation start];
}
Mi pregunta es múltiple. Busqué en Google hasta que mis dedos se adormecieron y aún tengo que encontrar un ejemplo de código decente que compruebe de forma simple y sencilla el estado de AFNetworking
mediante AFNetworking
. (Curiosamente, hay mucha discusión sobre la importación de SystemConfiguration.framework
, que parece ser una obviedad). Entonces, si mi usuario desea minimizar su uso de datos y descargar solo con wifi, ¿cómo verifico si hay wifi y solo descargo si hay wifi disponible?
En segundo lugar, parece que AFNetworking
quiere ser un front-end fácil de usar. Pero en realidad podría usar un front-end para este front-end, porque hay MUCHAS cosas que hay que eliminar para llegar a las cosas que uno necesita. Solo necesito acceder a una URL, descargar un archivo xml (basado en la accesibilidad) y hacer cosas con él. ¿Me estoy perdiendo algo que hace que esto sea una tarea simple?
Cuando entiendo esto, estoy construyendo totalmente un front-end o cinco para simplificar la implementación (asumiendo que no soy solo un idiota). Gracias de antemano por cualquier respuesta.
Con AFNetworking
2.0 y superior, uno puede verificar la disponibilidad de esta manera,
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
//available
break;
case AFNetworkReachabilityStatusNotReachable:
//not available
break;
default:
break;
}
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
//start monitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
Para obtener el estado actual
[AFNetworkReachabilityManager sharedManager].reachable
En realidad, al contrario de lo que A-Live dijo, Reachability ES una parte de AFNetworking. Se implementa en AFHTTPClient.h
here . Necesita las importaciones correctas en su archivo .pch
como se explica here para usarlo.
Para usarlo probablemente querrás tener una subclase de AFHTTPClient
para que puedas usar setReachabilityStatusChangeBlock
definido here . Aquí hay un ejemplo simple sin usar una subclase.
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://google.com"]];
[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status == AFNetworkReachabilityStatusNotReachable) {
// Not reachable
} else {
// Reachable
}
if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
// On wifi
}
}];
Si no te gusta cómo funciona esta configuración de accesibilidad, recomendaría la bifurcación de Alcance de Apple de Tony Million . Ejemplo simple:
Reachability *reach = [Reachability reachabilityWithHostname:@"google.com"];
if ([reach isReachable]) {
// Reachable
if ([reach isReachableViaWiFi]) {
// On WiFi
}
} else {
// Isn''t reachable
[reach setReachableBlock:^(Reachability *reachblock)
{
// Now reachable
}];
[reach setUnreachableBlock:^(Reachability*reach)
{
// Now unreachable
}];
}
Solo una actualización, la versión más reciente de AFNetworking ha dejado de usar AFHTTPClient.
Puede utilizar AFHTTPRequestOperationManager.h en su lugar
Algo pequeño tomado de la propia página github:
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; //url can be google.com or something you want to reach
NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
switch (status)
{
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
{
NSLog(@"SO REACHABLE");
[operationQueue setSuspended:NO]; // or do whatever you want
break;
}
case AFNetworkReachabilityStatusNotReachable:
default:
{
NSLog(@"SO UNREACHABLE");
[operationQueue setSuspended:YES];
//not reachable,inform user perhaps
break;
}
}
}];
[manager.reachabilityManager startMonitoring];