Коды NSError: URL-адрес Загрузка системных ошибок, которые означают потерю сети

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

NSURLErrorNotConnectedToInternet
NSURLErrorCannotConnectToHost
NSURLErrorTimedOut
NSURLErrorCannotFindHost
NSURLErrorCallIsActive
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed

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

Ответ 1

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

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

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

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

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

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

Ответ 3

В 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
}