NSURL Manejo de errores de session

Usando Swift y NSURLSession. El NSError localizedDescription que recibo es muy genérico cuando no tengo connection a internet (manualmente desconectado de wifi / networking celular). Dice " La operación no se pudo completar " .

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 

Estoy buscando un post más específico para enviar al usuario. Habilité un punto de interrupción e inspeccioné todos los objects pero no puedo encontrar nada bueno.

Antes de swift estaba usando AFNetworking con el objective C:

 failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

Los posts de error que obtuve aquí fueron muy descriptivos, algo así como " la connection a Internet parece estar fuera de línea "

Mire el code y el domain del object NSError resultante. Puede diagnosticar por qué falló al mirarlos.

Por ejemplo, un dominio de NSURLErrorDomain y un código de -1009 significa que no está conectado a Internet. Entonces, en Swift 3:

 if let error = error as? NSError, error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet { print("not connected") } 

Puede ver una list de estos códigos en las Variables globales: Referencia de constantes de base . Simplemente explore bajo el "Dominio NSURL".

Además, busque NSURLErrorNotConnectedToInternet presionando el command + shift + o y, a continuación, se lo llevará al encabezado correspondiente ( NSURLError.h ). Personalmente para este tipo de cosas, tiendo a confiar en los encabezados un poco más que la documentation. Si realiza esta búsqueda cuando trabaja con Objective-C, incluso verá una reference cruzada a los códigos CFURLError (que puede orderar -click o command + shift + o y busque kCFURLErrorNotConnectedToInternet ), y si los explora, Verás realmente los valores numéricos asociados con estas constantes.

 var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in if error == nil { //all ok do what you want to do } else { let alertController = UIAlertController(title: "Error", message: "Put your error message here", prefernetworkingStyle: .Alert) let cancelAction = UIAlertAction(title: "OK", style: .Cancel) { (action) in } alertController.addAction(cancelAction) self.presentViewController(alertController, animated: true) } }) 

Esta implementación muestra una alerta para el usuario de que algo salió mal. Puede manejar el error como desee (por ejemplo, reintentando la request sin molestar al usuario con una alerta). UIAlertController es iOS 8. Si desea admitir iOS 7, muestre un UIAlertView .

¿Te refieres a la operation.responseString para la respuesta de error específica del backend? Acabo de encontrarlo ayer, AFHTTPSessionManager esto en el bloque de AFHTTPSessionManager request AFHTTPSessionManager

 NSError *underError = error.userInfo[@"NSUnderlyingError"]; NSData *responseData = underError.userInfo[@"com.alamofire.serialization.response.error.data"]; 

Aquí está la pregunta que le hice a AFN / Github . Espero que sea útil.