错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”相关的知识,希望对你有一定的参考价值。

我有一个适用于Xcode6-Beta1和Xcode6-Beta2的ios7和iOS8应用程序。但是对于Xcode6-Beta3,Beta4,Beta5,我面临着iOS8的网络问题,但在iOS7上一切正常。我得到错误"The network connection was lost."。错误如下:

错误:错误域= NSURLErrorDomain代码= -1005“网络连接丢失。” UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =,_ kCFStreamErrorCodeKey = 57,NSErrorFailingURLKey =,NSLocalizedDescription =网络连接丢失。,_ kCFStreamErrorDomainKey = 1,NSUnderlyingError = 0x7a6957e0“网络连接丢失。”}

我使用AFNetworking 2.x和以下代码片段进行网络调用:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setSecurityPolicy:policy];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:<example-url>
   parameters:<parameteres>
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@“Success: %@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"Error: %@", error);
      }];

我试过NSURLSession但仍然收到同样的错误。

答案

重启模拟器为我解决了这个问题。

另一答案

我也得到了这个错误,但是在实际设备而不是模拟器上。我们注意到在HTTPS(gunicorn服务器)上访问我们的heroku后端时的错误,以及使用大型机身(任何超过64Kb)的POSTS。我们使用HTTP Basic Auth进行身份验证,并注意到错误是通过在NSURLSession上使用didReceiveChallenge:委托方法解决的,而是通过添加Authentiation: Basic <Base64Encoded UserName:Password>将身份验证烘焙到原始请求标头中。这可以防止必要的401触发didReceiveChallenge:委托消息,并且后续网络连接丢失。

另一答案

我有同样的问题。解决方案很简单,我设置了HTTPBody,但没有将HTTPMethod设置为POST。修好后,一切都很好。

另一答案

我有同样的问题。我不知道AFNetworking如何实现https请求,但我的原因是NSURLSession的缓存问题。

在我的应用程序从safari跟踪回来然后发布http请求后,将出现“http load failed 1005”错误。如果我停止使用"[NSURLSession sharedSession]",但是使用可配置的NSURLSession实例来调用“dataTaskWithRequest:”方法,则问题就解决了。

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.URLCache = nil;
self.session = [NSURLSession sessionWithConfiguration:config];

只记得设置config.URLCache = nil;

另一答案

我不得不退出XCode,删除DerivedData文件夹内容(〜/ Library / Developer / Xcode / DerivedData或/ Library / Developer / Xcode / DerivedData)并退出模拟器以使其工作。

另一答案

我也有这个问题,在iOS 8设备上运行。它详细介绍了一些here,似乎是iOS尝试使用已经超时的连接的情况。我的问题与该链接中解释的Keep-Alive问题不同,但它似乎是相同的最终结果。

每当我收到错误-1005时,我通过运行递归块来纠正我的问题,这使得连接最终通过,即使有时递归可以在连接工作之前循环100次,但是它只增加了一秒钟的运行我打赌,这只是调试器为我打印NSLog所需的时间。

以下是我使用AFNetworking运行递归块的方法:将此代码添加到连接类文件中

// From Mike Ash's recursive block fixed-point-combinator strategy https://gist.github.com/1254684
dispatch_block_t recursiveBlockVehicle(void (^block)(dispatch_block_t recurse))
{
    // assuming ARC, so no explicit copy
    return ^{ block(recursiveBlockVehicle(block)); };
}
typedef void (^OneParameterBlock)(id parameter);
OneParameterBlock recursiveOneParameterBlockVehicle(void (^block)(OneParameterBlock recurse, id parameter))
{
    return ^(id parameter){ block(recursiveOneParameterBlockVehicle(block), parameter); };
}

然后使用它喜欢这个:

+ (void)runOperationWithURLPath:(NSString *)urlPath
            andStringDataToSend:(NSString *)stringData
                    withTimeOut:(NSString *)timeOut
     completionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    OneParameterBlock run = recursiveOneParameterBlockVehicle(^(OneParameterBlock recurse, id parameter) {
        // Put the request operation here that you want to keep trying
        NSNumber *offset = parameter;
        NSLog(@"--------------- Attempt number: %@ ---------------", offset);

        MyAFHTTPRequestOperation *operation =
            [[MyAFHTTPRequestOperation alloc] initWithURLPath:urlPath
            andStringDataToSend:stringData
            withTimeOut:timeOut];

        [operation setCompletionBlockWithSuccess:
            ^(AFHTTPRequestOperation *operation, id responseObject) {
                success(operation, responseObject);
            }
            failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
                if (error.code == -1005) {
                    if (offset.intValue >= numberOfRetryAttempts) {
                        // Tried too many times, so fail
                        NSLog(@"Error during connection: %@",error.description);
                        failure(operation2, error);
                    } else {
                        // Failed because of an iOS bug using timed out connections, so try again
                        recurse(@(offset.intValue+1));
                    }
                } else {
                    NSLog(@"Error during connection: %@",error.description);
                    failure(operation2, error);
                }
            }];
        [[NSOperationQueue mainQueue] addOperation:operation];
    });
    run(@0);
}

您将看到我使用AFHTTPRequestOperation子类但添加您自己的请求代码。重要的是调用recurse(@offset.intValue+1));来重新调用块。

另一答案

如果设备上出现问题,请检查流量是否通过代理(设置> Wi-Fi>(信息)> HTTP代理)。我的设备设置与Charles一起使用,但忘记了代理。似乎没有Charles实际运行此错误。

另一答案

如果有人在将文件上载到后端服务器时收到此错误,请确保接收服务器具有允许您的媒体使用的最大内容大小。就我而言,nginx需要更高的client_max_body_size。 NGINX会在上传完成之前拒绝请求,因此没有错误代码返回。

另一答案

当我使用Xcode 6.2 beta时,我在iOS 7设备上收到错误。

从Xcode 6.2 beta切换回6.1.1解决了这个问题,至少在iOS 7设备上。

另一答案

几个月来问题,终于发现当我们在api域上禁用DNSSEC时,一切正常:simple_smile:

另一答案

我通过VPN连接。禁用VPN解决了这个问题。

另一答案

我们遇到了这个确切的错误,结果证明NSURLRequest的底层HTTP实现存在问题:

据我们所知,当iOS 8/9/10/11收到带有Keep-Alive标头的HTTP响应时,它会保持此连接稍后重复使用(应该如此),但它保留的次数超过timeout参数Keep-Alive标头(似乎始终保持连接活动30秒。)然后当应用程序在30秒后发送第二个请求时,它会尝试重新使用可能已被删除的连接服务器(如果超过真正的Keep-Alive已经过去)。

以下是我们迄今为止找到的解决方案:

  • 将服务器的超时参数增加到30秒以上。看起来iOS总是表现得好像服务器将保持连接打开30秒,而不管Keep-Alive标头中提供的值。 (这可以通过设置KeepAliveTimeout选项为Apache完成。
  • 您可以根据应用程序的User-Agent为iOS客户端禁用保持活动机制(例如,对于Apache:BrowserMatch "iOS 8." nokeepalive中的setenvif.conf
  • 如果您无权访问服务器,则可以尝试使用Connection: close标头发送请求:这将告诉服务器立即断开连接并在没有任何保持活动标头的情况下进行响应。但是目前,NSURLSession似乎在发送请求时覆盖了Connection标头(我们没有广泛测试这个解决方案,因为我们可以调整Apache配置)
另一答案

在将NSURLRequest传递给NSURLSession而不设置请求的HTTPMethod时,我遇到了此错误。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];

错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”

但是,添加HTTPMethod,连接正常

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
[request setHTTPMethod:@"PUT"];
另一答案

测试您是否可以从其他应用程序(如safari)请求。如果没有,可能是您的计算机上的东西。在我的情况下,我遇到了Avast Antivirus的这个问题,它阻止了我的模拟器请求(不要问我为什么)。

另一答案

重新启动计算机修复了Xcode9.1的问题。我重新启动了模拟器和Xcode,它不起作用。

另一答案

关于2017-01-25 Apple发布了有关此错误的技术问答:

Apple技术问答QA1941

Handling “The network connection was lost” Errors

答:NSURLErrorNetworkNctionConnectionLost在NSURLErrorDomain错误域中是错误-1005,并以“网络连接丢失”显示给用户。此错误表示在HTTP请求正在进行时,承载HTTP请求的基础TCP连接已断开连接(有关此信息的详细信息,请参阅下文)。在某些情况下,NSURLSession可能会自动重试此类请求(特别是,如果请求是幂等的),但在HTTP标准不允许的其他情况下。

https://developer.apple.com/library/archive/qa/qa1941/_index.html#//apple_ref/doc/uid/DTS40017602

另一答案

由于以下原因,我遇到了这个问题。

TLDR:检查您是否发送了GET请求,该请求应该在url而不是NSURLRequest's HTTBody属性上发送参数。

==================================================

我在我的应用程序上安装了一个网络抽象,它对我的​​所有请求都运行良好。

我向另一个Web服务(不是我自己的)添加了一个新请求,它开始向我抛出此错误。

我去了一个操场,从头开始建立一个准系统请求,它起作用了。所以我开始接近我的抽象,直到找到原因。

我的抽象实现有一个错误:我发送的请求应该发送在url中编码的参数,我也用查询参数填充NSURLRequest's HTTBody属性。我一删除HTTPBody就行了。

另一答案

我收到了这个错误,并且还注意到Postman应用程序也在下降但是在应用程序Advanced Rest Client(ARC)中工作并在android中工作。所以我不得不安装Charles来调

以上是关于错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”的主要内容,如果未能解决你的问题,请参考以下文章

错误:错误域=NSURLErrorDomain 代码=-1001 “请求超时。”

错误:错误域=NSURLErrorDomain 代码=-1001“请求超时。”

API 失败,错误域=NSURLErrorDomain 代码=-1003

Alamofire 蜂窝网络“错误域=NSURLErrorDomain 代码=-1009”

错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”

CLGeocoder 反向地理编码失败,错误域=NSURLErrorDomain 代码=-1000 -