2012-02-15 10 views
10

Sto provando a scrivere un elenco definitivo di tutti i possibili codici di errore URL che significano la perdita della connessione di rete, inclusi i blip e l'interruzione prolungata. Ecco quello che ho finora:

NSURLErrorNotConnectedToInternet
NSURLErrorCannotConnectToHost
NSURLErrorTimedOut
NSURLErrorCannotFindHost
NSURLErrorCallIsActive
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed
Codici NSError: URL Caricamento di errori di sistema che significano perdita di rete

sto segnalazione di errori di servizi web incontrate dalla app e voglio filtrare fuori gli errori causati a causa di nessuna colpa del servizio web. Osservo il codice di errore URL ottenuto dall'oggetto errore passato nella connessione NSURLConnectionDelegate: didFailWithError: method. Inoltre, preferirei non controllare ogni volta la disponibilità prima di chiamare il servizio web, poiché la connessione di rete può ancora essere persa a caso. Se hai la tua lista o un suggerimento migliore, per favore fammi sapere. Grazie.

+0

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

+0

NSHipster ha una grande panoramica di quelli: http://nshipster.com/nserror/ – dlinsin

risposta

11

NSURLErrorCannotFindHost = -1003,

NSURLErrorCannotConnectToHost = -1004,

NSURLErrorNetworkConnectionLost = -1005,

NSURLErrorDNSLookupFailed = -1006,

NSURLErrorHTTPTooManyRedirects = -1007,

NSURLErrorResourceUnavailable = -1008,

NSURLErrorNotConnectedToInternet = -1009,

NSURLErrorRedirectToNonExistentLocation = -1010,

NSURLErrorInternationalRoamingOff = -1018,

NSURLErrorCallIsActive = -1019,

NSURLErrorDataNotAllowed = -1020,

NSURLErrorSecureConnectionFailed = -1200,

NSURLErrorCannotLoadFromNetwork = -2000,

+2

La maggior parte di questi non significa che ci sia una perdita di connessione di rete. Ad esempio, NSURLErrorHTTPTooManyRedirects è un ciclo infinito di reindirizzamenti, quindi chiaramente hai una connessione di rete quando questo accade. – gnasher729

5

Io uso il seguente metodo nel mio progetto

-(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; 
} 

Poi ho solo controllare il codice di errore e mostrare avviso se è nella lista

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

I utilizzare l'elenco da Undocumented NSURLErrorDomain error codes (-1001, -1003 and -1004) using StoreKit

Ma come potete vedere ho commentato i codici che penso non si adattano alla mia def inizione di NO INTERNET. E.g il codice di -1012 (Errore di autenticazione.) È possibile modificare l'elenco come desiderato.

Nel mio progetto lo uso a nome utente/password inserendo dall'utente.E a mio avviso, gli errori di connessione di rete (fisica) potrebbero essere l'unico motivo per mostrare la visualizzazione di avviso nell'app basata sulla rete. In tutti gli altri casi (ad esempio coppia di username/password errata) preferisco creare un'animazione personalizzata di facile utilizzo, OPPURE ripetere il tentativo fallito senza alcuna attenzione da parte dell'utente. Soprattutto se l'utente non ha avviato esplicitamente una chiamata di rete.

Saluti a martinezdelariva dalla domanda che ho citato per un collegamento alla documentazione.

+0

'++ i' salterà il primo codice di errore dall'elenco – igrek

3

In Swift, sto usando la seguente categoria semplice. Non affronta tutti gli scenari, ma è l'implementazione più facile per me che funziona abbastanza bene.

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

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

Uso come segue:

if error.isNetworkConnectionError() { 
    // Show no internet message 
} 
Problemi correlati