NSError代码:URL加载意味着网络丢失的系统错误

时间:2012-02-15 01:10:08

标签: iphone ios nsurlconnection

我正在尝试编写一份所有可能的URL错误代码的明确列表,这些代码意味着网络连接丢失,包括blips和延长的中断。这是我到目前为止所拥有的:

NSURLErrorNotConnectedToInternet
NSURLErrorCannotConnectToHost
NSURLErrorTimedOut
NSURLErrorCannotFindHost
NSURLErrorCallIsActive
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed

我正在报告应用程序遇到的Web服务错误,我想过滤掉由于没有Web服务错误而导致的错误。我查看从NSURLConnectionDelegate的connection:didFailWithError:方法中传递的错误对象获取的URL错误代码。此外,我不想在调用Web服务之前每次都检查Reachability,因为网络连接仍然可能随机丢失。如果您有自己的清单或更好的建议,请告诉我。感谢。

4 个答案:

答案 0 :(得分: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,

答案 1 :(得分:6)

我在项目中使用以下方法

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

我使用Undocumented NSURLErrorDomain error codes (-1001, -1003 and -1004) using StoreKit

中的列表

但是你可以看到我注释掉了我认为不适合我的NO INTERNET定义的代码。例如-1012的代码(验证失败。) 您可以根据需要编辑列表。

在我的项目中,我在用户输入的用户名/密码中使用它。在我看来(物理)网络连接错误可能是在基于网络的应用程序中显示警报视图的唯一原因。在任何其他情况下(例如,不正确的用户名/密码对)我更喜欢做一些自定义的用户友好动画,或者只是在没有用户注意的情况下再次重复失败的尝试。特别是如果用户没有明确发起网络呼叫。

关于martinezdelariva从我提到的问题链接到文档。

答案 2 :(得分: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
}

答案 3 :(得分:0)

对于Swift错误类型,我基于 Antoine 答案编写了此扩展名。

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

        let error = self as NSError
        
        return networkErrors.contains(error.code)
    }
}