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



我正试图写一个明确的列表,列出所有可能的URL错误代码,这些错误代码意味着网络连接丢失,包括暂时中断和长期中断。以下是我目前所掌握的:

NSURLError未连接到Internet
NSURLErrorAnnotConnect到主机
NSURLErrorTimedOut
NSURLErrorAnnotFindHost
NSURLErrorCall处于活动状态
NSURLErrorNetworkConnectionLost
NSURLErrorDataNotAllowed

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

NSURLErrorAnnotFindHost=-1003,

NSURLErrorAnnotConnectToHost=-1004,

NSURLErrorNetworkConnectionLost=-1005,

NSURLErrorDNSLookupFailed=-1006,

NSURLErrorHTTPTooManyRedirects=-1007,

NSURLErrorResource Unavailable=-1008,

NSURLErrorNotConnectedToInternet=-1009,

NSURLErrorDirectToNonExistentLocation=-1010,

NSURLErrorInternalRoamingOff=-1018,

NSURLErrorCallIsActive=-1019,

NSURLErrorDataNotAllowed=-1020,

NSURLErrorSecureConnectionFailed=-1200,

NSURLErrorAnnotLoadFromNetwork=-2000,

我在项目中使用以下方法

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

我使用StoreKit 使用Undocumented NSURLDomain错误代码(-1001、-1003和-1004)中的列表

但正如你所看到的,我评论了一些代码,我认为这些代码不符合我对无互联网的定义。例如代码-1012(身份验证失败。)您可以根据自己的喜好编辑列表。

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

关于martinezdelariva,我提到了一个链接到文档的问题。

在Swift中,我使用以下简单类别。它并不能解决所有的场景,但对我来说是最简单的实现,效果非常好。

extension NSError {
    func isNetworkConnectionError() -> Bool {
        let networkErrors = [NSURLErrorNetworkConnectionLost, NSURLErrorNotConnectedToInternet]
        
        if self.domain == NSURLErrorDomain && networkErrors.contains(error.code) {
            return true
        }
        return false
    }
}

用途如下:

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

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

extension Error {
    func isNetworkConnectionError() -> Bool {
        let networkErrors = [NSURLErrorNetworkConnectionLost, NSURLErrorNotConnectedToInternet]
        let error = self as NSError
        
        return networkErrors.contains(error.code)
    }
}

最新更新