Коды ошибок NSE: URL Загрузка системных ошибок, которые означают потерю сети - PullRequest
10 голосов
/ 15 февраля 2012

Я пытаюсь написать полный список всех возможных кодов ошибок URL, которые означают потерю сетевого подключения, включая сообщения и продолжительные простои. Вот что у меня так далеко:

NSURLErrorNotConnectedToInternet
NSURLErrorCannotConnectToHost
NSURLErrorTimedOut
NSURLErrorCannotFindHost
NSURLErrorCallIsActive
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed

Я сообщаю об ошибках веб-службы, с которыми сталкивается приложение, и хочу отфильтровать ошибки, вызванные отсутствием ошибки веб-службы. Я смотрю на код ошибки URL, полученный из объекта ошибки, переданного в соединении NSURLConnectionDelegate: didFailWithError: метод. Кроме того, я бы предпочел не проверять доступность каждый раз перед вызовом веб-службы, поскольку сетевое соединение все еще может быть потеряно случайным образом. Если у вас есть свой собственный список или лучшее предложение, пожалуйста, дайте мне знать. Спасибо.

Ответы [ 3 ]

11 голосов
/ 18 мая 2012

NSURLErrorCannotFindHost = -1003,

NSURLErrorCannotConnectToHost = -1004,

NSURLErrorNetworkConnectionLost = -1005,

NSURLErrorDNSLookupFailed = 100 * *URRT = 100 * *URRT = 100 *1007,

NSURLErrorResourceUnavailable = -1008,

NSURLErrorNotConnectedToInternet = -1009,

NSURLErrorRedirectToNonExistentLocation = -1010,

*1010* International1NRR1018 * NSURLErrorCallIsActive = -1019,

NSURLErrorDataNotAllowed = -1020,

NSURLErrorSecureConnectionFailed = -1200,

NSURLErrorCannotLoadFromN25 = 2500 = сеть =

6 голосов
/ 26 апреля 2014

Я использую следующий метод в моем проекте

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

Тогда я просто проверяю код ошибки и показываю предупреждение, если оно есть в списке

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

Я использую список из Недокументированных кодов ошибок NSURLErrorDomain (-1001, -1003 и -1004), используя StoreKit

Но, как вы можете видеть, я закомментировал коды, которые, как мне кажется, не соответствуют моему определению НЕТ ИНТЕРНЕТА. Например, код -1012 (Ошибка аутентификации.) Вы можете редактировать список, как вам нравится.

В моем проекте я использую его при вводе имени пользователя / пароля от пользователя. И, на мой взгляд, (физические) ошибки сетевого подключения могут быть единственной причиной для отображения представления предупреждений в вашем сетевом приложении. В любом другом случае (например, неверная пара имя пользователя / пароль) я предпочитаю делать пользовательскую анимацию, удобную для пользователя, ИЛИ просто повторять неудачную попытку снова без какого-либо внимания со стороны пользователя. Особенно, если пользователь явно не инициировал сетевой вызов.

Относительно martinezdelariva из вопроса, который я упомянул для ссылки на документацию.

3 голосов
/ 27 июля 2015

В Swift я использую следующую простую категорию.Он не затрагивает все сценарии, но для меня это самая простая реализация, которая работает довольно хорошо.

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

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

Использование следующим образом:

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