2012-02-15 10 views
10

Estoy tratando de escribir una lista definitiva de todos los posibles códigos de error de URL que significan la pérdida de conexión de red, incluidos los fallos y la interrupción prolongada. Esto es lo que tengo hasta ahora:

NSURLErrorNotConnectedToInternet
NSURLErrorCannotConnectToHost
NSURLErrorTimedOut
NSURLErrorCannotFindHost
NSURLErrorCallIsActive
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed
NSError códigos: URL Cargando errores del sistema que significan pérdida de red

estoy informar de los errores de servicios web encontradas por la aplicación y quiero filtrar los errores causados ​​debido a la falta del servicio web. Miro el código de error de URL obtenido del objeto de error pasado en la conexión NSURLConnectionDelegate: didFailWithError: method. Además, preferiría no verificar la accesibilidad cada vez que llame al servicio web, ya que la conexión de red aún se puede perder al azar. Si tiene su propia lista o una mejor sugerencia, hágamelo saber. Gracias.

+0

https://developer.apple.com/library/ios/#documentation/cocoa/reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html –

+0

NSHipster tiene una excelente descripción de aquellos: http://nshipster.com/nserror/ – dlinsin

Respuesta

11

NSURLErrorCannotFindHost = -1,003,

NSURLErrorCannotConnectToHost = -1,004,

NSURLErrorNetworkConnectionLost = -1,005,

NSURLErrorDNSLookupFailed = -1,006,

NSURLErrorHTTPTooManyRedirects = -1007,

NSURLErrorResourceUnavailable = -1008,

NSURLErrorNotConnectedToInternet = -1,009,

NSURLErrorRedirectToNonExistentLocation = -1,010,

NSURLErrorInternationalRoamingOff = -1,018,

NSURLErrorCallIsActive = -1,019,

NSURLErrorDataNotAllowed = -1,020,

NSURLErrorSecureConnectionFailed = -1200,

NSURLErrorCannotLoadFromNetwork = -2,000,

+2

La mayoría de estos no significa que hay una pérdida de conexión de red. Por ejemplo, NSURLErrorHTTPTooManyRedirects es un bucle infinito de redireccionamientos, por lo que es evidente que tiene una conexión de red cuando esto sucede. – gnasher729

5

utilizo el siguiente método en mi proyecto

-(NSArray*)networkErrorCodes 
{ 
    static NSArray *codesArray; 
    if (![codesArray count]){ 
     @synchronized(self){ 
      const int codes[] = { 
       //kCFURLErrorUnknown,  //-998 
       //kCFURLErrorCancelled, //-999 
       //kCFURLErrorBadURL,  //-1000 
       //kCFURLErrorTimedOut, //-1001 
       //kCFURLErrorUnsupportedURL, //-1002 
       //kCFURLErrorCannotFindHost, //-1003 
       kCFURLErrorCannotConnectToHost,  //-1004 
       kCFURLErrorNetworkConnectionLost, //-1005 
       kCFURLErrorDNSLookupFailed,   //-1006 
       //kCFURLErrorHTTPTooManyRedirects, //-1007 
       kCFURLErrorResourceUnavailable,  //-1008 
       kCFURLErrorNotConnectedToInternet, //-1009 
       //kCFURLErrorRedirectToNonExistentLocation, //-1010 
       kCFURLErrorBadServerResponse,    //-1011 
       //kCFURLErrorUserCancelledAuthentication,  //-1012 
       //kCFURLErrorUserAuthenticationRequired,  //-1013 
       //kCFURLErrorZeroByteResource,  //-1014 
       //kCFURLErrorCannotDecodeRawData,  //-1015 
       //kCFURLErrorCannotDecodeContentData, //-1016 
       //kCFURLErrorCannotParseResponse,  //-1017 
       kCFURLErrorInternationalRoamingOff, //-1018 
       kCFURLErrorCallIsActive,    //-1019 
       //kCFURLErrorDataNotAllowed,    //-1020 
       //kCFURLErrorRequestBodyStreamExhausted, //-1021 
       kCFURLErrorFileDoesNotExist,   //-1100 
       //kCFURLErrorFileIsDirectory,    //-1101 
       kCFURLErrorNoPermissionsToReadFile,  //-1102 
       //kCFURLErrorDataLengthExceedsMaximum,  //-1103 
      }; 
      int size = sizeof(codes)/sizeof(int); 
      NSMutableArray *array = [[NSMutableArray alloc] init]; 
      for (int i=0;i<size;++i){ 
       [array addObject:[NSNumber numberWithInt:codes[i]]]; 
      } 
      codesArray = [array copy]; 
     } 
    } 
    return codesArray; 
} 

Entonces sólo comprobar el código de error y mostrar alerta si está en la lista

if ([[self networkErrorCodes] containsObject:[NSNumber 
numberWithInt:[error code]]]){ 
// Fire Alert View Here 
} 

I use la lista de Undocumented NSURLErrorDomain error codes (-1001, -1003 and -1004) using StoreKit

Pero como pueden ver, comenté códigos que creo que no se ajustan a mi definición inición de NO INTERNET. Por ejemplo, el código de -1012 (Autenticación fallida) Puede editar la lista como desee.

En mi proyecto lo uso en el nombre de usuario/contraseña que ingresa del usuario.Y en mi opinión (física), los errores de conexión a la red pueden ser la única razón para mostrar una vista de alerta en su aplicación basada en la red. En cualquier otro caso (por ejemplo, un par de nombre de usuario/contraseña incorrectos) prefiero hacer alguna animación personalizada fácil de usar, O simplemente repetir el intento fallido nuevamente sin ninguna atención del usuario. Especialmente si el usuario no inició explícitamente una llamada de red.

Saludos a martinezdelariva de la pregunta que mencioné para un enlace a la documentación.

+0

'++ i' omitirá el primer código de error de la lista – igrek

3

En Swift, estoy usando la siguiente categoría simple. No aborda todos los escenarios, pero es la implementación más fácil para mí que funciona bastante bien.

extension NSError { 
    func isNetworkConnectionError() -> Bool { 
     let networkErrors = [NSURLErrorNetworkConnectionLost, NSURLErrorNotConnectedToInternet] 

     if self.domain == NSURLErrorDomain && contains(networkErrors, self.code) { 
      return true 
     } 
     return false 
    } 
} 

Uso como sigue:

if error.isNetworkConnectionError() { 
    // Show no internet message 
} 
Cuestiones relacionadas