Коды 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
}