2012-02-15 9 views
10

Próbuję napisać ostateczną listę wszystkich możliwych kodów błędów URL, które oznaczają utratę połączenia sieciowego, w tym blipy i dłuższy czas przestoju. Oto co mam do tej pory:

NSURLErrorNotConnectedToInternet
NSURLErrorCannotConnectToHost
NSURLErrorTimedOut
NSURLErrorCannotFindHost
NSURLErrorCallIsActive
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed
Kody NSError: URL Ładowanie błędów systemowych oznaczających utratę sieci

mam raportowania błędów serwis internetowy napotykanych przez aplikację i chcę, aby filtrować błędów spowodowanych brakiem błędu usługi internetowej. Patrzę na kod błędu URL uzyskany z obiektu błędu przekazanego w połączeniu NSURLConnectionDelegate: didFailWithError: method. Poza tym wolałbym nie sprawdzać dostępności za każdym razem przed wywołaniem usługi internetowej, ponieważ połączenie sieciowe może zostać utracone losowo. Jeśli masz własną listę lub lepszą sugestię, daj mi znać. Dzięki.

+0

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

+0

NSHipster ma świetny przegląd tych: http://nshipster.com/nserror/ – dlinsin

Odpowiedz

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

Większość z nich nie oznacza utraty połączenia sieciowego. Na przykład NSURLErrorHTTPTooManyRedirects to nieskończona pętla przekierowań, więc jasne jest, że masz połączenie sieciowe, kiedy tak się dzieje. – gnasher729

5

używam następujące metody w moim projekcie

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

Potem wystarczy sprawdzić kod błędu i pokazać alert, jeśli znajduje się na liście

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

I użyj listy od Undocumented NSURLErrorDomain error codes (-1001, -1003 and -1004) using StoreKit

Ale jak widzisz, skomentowałem kody, które moim zdaniem nie pasują do mojej nie ma ŻADNEGO INTERNETU. Np. Kod -1012 (Uwierzytelnienie nie powiodło się.) Możesz edytować listę, jak chcesz.

W moim projekcie używam go pod nazwą użytkownika/hasłem wprowadzanym przez użytkownika.A w moim widoku (fizyczne) błędy połączenia sieciowego mogą być jedynym powodem, aby wyświetlić widok alertów w aplikacji sieciowej. W każdym innym przypadku (np. Niepoprawna nazwa użytkownika/hasło) wolę wykonać niestandardową, przyjazną dla użytkownika animację, LUB po prostu powtórzyć nieudaną próbę ponownie bez żadnej uwagi użytkownika. Zwłaszcza, jeśli użytkownik nie zainicjował jawnie połączenia sieciowego.

Odnosi się do martinezdelariva z pytania, o którym wspomniałem o link do dokumentacji.

+0

'++ i' pominie pierwszy kod błędu z listy – igrek

3

W Swift używam następującej prostej kategorii. Nie dotyczy wszystkich scenariuszy, ale jest najłatwiejszą implementacją, która działa całkiem dobrze.

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

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

Zastosowanie jak następuje:

if error.isNetworkConnectionError() { 
    // Show no internet message 
} 
Powiązane problemy