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

时间:2014-08-18 21:28:35

标签: ios8 ios-simulator xcode6 xcode6-beta5

我有一个适用于iOS7和iOS8的Xcode6-Beta1和Xcode6-Beta2的应用程序。但是对于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但仍然收到同样的错误。

32 个答案:

答案 0 :(得分:412)

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

答案 1 :(得分:214)

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

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

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

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

答案 2 :(得分:47)

对于我的,Resetting content and settings模拟器工作。 要重置模拟器,请按以下步骤操作:

  

iOS模拟器 - &gt;重置内容和设置 - &gt;按重置(在   警告将来临)

答案 3 :(得分:29)

iOS 8.0模拟器运行时存在一个错误,即如果在模拟设备启动时网络配置发生更改,模拟运行时中的更高级API(例如:CFNetwork)将认为它已丢失网络连接。目前,建议的解决方法是在网络配置发生变化时重新启动模拟设备。

如果您受到此问题的影响,请在http://bugreport.apple.com处提交其他重复的雷达,以提高其优先级。

如果您看到此问题没有更改了网络配置,那么这不是一个已知的错误,您肯定应该提交雷达,表明问题不是已知的网络配置更改错误。

答案 4 :(得分:11)

在iOS 8模拟器上运行时,测试版5和AFNetworking 1.3也会出现问题导致连接错误:

  

Domain = NSURLErrorDomain Code = -1005&#34;网络连接丢失。&#34;

相同的代码在iOS 7和7.1模拟器上运行正常,我的调试代理显示在实际尝试连接之前发生了故障(即没有记录请求)。

我已经跟踪了NSURLConnection的失败并向Apple报告了错误。见附图中的第5行:

NSURLConnection client delegate did fail error

更改为使用https允许从iOS 8模拟器连接,但会出现间歇性错误。

Xcode 6.01(gm)中仍存在问题。

答案 5 :(得分:10)

解决了我的问题是重启模拟器,重置内容和设置。

答案 6 :(得分:9)

打开Charles为我解决了这个问题,这看起来很奇怪......

  

Charles是一个HTTP代理/ HTTP监视器/反向代理,使开发人员能够查看其计算机和Internet之间的所有HTTP和SSL / HTTPS流量。这包括请求,响应和HTTP标头(包含cookie和缓存信息)。

答案 7 :(得分:9)

我在使用Alamofire时遇到了这个问题。我的错误是我在[:]请求中为参数发送了一个空字典GET,而不是发送nil个参数。

希望这有帮助!

答案 8 :(得分:6)

See pjebs comment on Jan 5 on Github.

方法1:

if (error.code == -1005)
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        dispatch_group_t downloadGroup = dispatch_group_create();
        dispatch_group_enter(downloadGroup);
        dispatch_group_wait(downloadGroup, dispatch_time(DISPATCH_TIME_NOW, 5000000000)); // Wait 5 seconds before trying again.
        dispatch_group_leave(downloadGroup);
        dispatch_async(dispatch_get_main_queue(), ^{
            //Main Queue stuff here
            [self redoRequest]; //Redo the function that made the Request.
        });
    });

    return;
}

还有人建议重新连接到网站,

即。 两次点击POST请求

解决方案:使用方法连接到站点,返回(id),如果网络连接丢失,返回使用相同的方法。

方法2

-(id) connectionSitePost:(NSString *) postSender Url:(NSString *) URL {
     // here set NSMutableURLRequest =>  Request

    NSHTTPURLResponse *UrlResponse = nil;
    NSData *ResponseData = [[NSData alloc] init];

    ResponseData = [NSURLConnection sendSynchronousRequest:Request returningResponse:&UrlResponse error:&ErrorReturn];

     if ([UrlResponse statusCode] != 200) {

          if ([UrlResponse statusCode] == 0) {

                  /**** here re-use method ****/
                  return [self connectionSitePost: postSender Url: URL];
          }

     } else {
          return ResponseData;
     }

}

答案 9 :(得分:3)

我遇到了同样的问题。我不知道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;

答案 10 :(得分:3)

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

答案 11 :(得分:3)

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

答案 12 :(得分:2)

我也有这个问题,在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));来重新调用块。

答案 13 :(得分:2)

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

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

答案 14 :(得分:2)

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

答案 15 :(得分:2)

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

答案 16 :(得分:1)

我的问题出在服务器上。我正在使用Python的BaseHTTPRequestHandler类,但没有在响应中发送正文。当我像下面这样放空身体时,我的问题就解决了。

def do_POST(self):
    content_len = int(self.headers.get('Content-Length'))
    post_body = self.rfile.read(content_len)
    msg_string = post_body.decode("utf-8")
    msg_json = json.loads(msg_string)
    self.send_response(200)
    self.end_headers() #this and the following lines were missing
    self.wfile.write(b'') 

答案 17 :(得分:1)

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

  

Apple技术问答QA1941

     

处理“网络连接丢失”错误

     

A:NSURLErrorNetworkConnectionLost在NSURLErrorDomain错误域中为错误-1005,并向用户显示为“网络连接丢失”。此错误意味着在进行HTTP请求时,承载HTTP请求的基础TCP连接已断开连接(有关此信息,请参见下文)。在某些情况下,NSURLSession可以自动重试此类请求(特别是在请求是幂等的情况下),但在其他情况下,HTTP标准不允许。

     

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

答案 18 :(得分:1)

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

答案 19 :(得分:1)

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

答案 20 :(得分:1)

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

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

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

添加HTTPMethod,连接正常

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

答案 21 :(得分:1)

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

答案 22 :(得分:1)

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

答案 23 :(得分:1)

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

答案 24 :(得分:0)

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

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

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

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

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

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

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

答案 25 :(得分:0)

我收到了这个错误,并且还注意到Postman应用程序也在下降但是正在使用应用程序Advanced Rest Client(ARC)并在Android中工作。 所以我不得不安装Charles来调试通信,我注意到响应代码是-1。 问题是REST程序员忘记返回响应代码200。

我希望这有助于其他开发者。

答案 26 :(得分:0)

我遇到了同样的问题, 我已启用网络链接调节器,以便对应用进行慢速网络测试。这有时会造成这个错误, 当我从Settings > Developer > Network Link Conditioner禁用它时,它解决了我的问题。

enter image description here

希望这有助于某人。

答案 27 :(得分:0)

在通过iOS 12应用和物理设备使用我公司的服务器进行呼叫时,我遇到了同样的问题。问题是服务器硬盘已满。释放服务器中的空间即可解决问题。

在我认为的另一种情况下,我发现了相同的错误,原因是超时无法通过Apple提供的标准Networking API(URLSession.timeoutIntervalForRequestURLSession.timeoutIntervalForResource)进行参数设置。甚至在那里..使服务器应答更快地解决了问题

答案 28 :(得分:0)

在我的情况下,这是因为我正在连接到HTTP并且它在HTTPS上运行

答案 29 :(得分:0)

这可能是您传递给请求正文的参数的问题。我也面临着同样的问题。但是后来我在https://stackoverflow.com/a/34181221/5867445上遇到了CMash的答案,我更改了参数,它起作用了。

我要传递的参数中的问题大约是String Encoding

希望这会有所帮助。

答案 30 :(得分:-1)

每当得到错误-1005,则需要再次调用API。

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);
      if (error.code == -1005) {
          // Call method again... 
       }
  }];

您需要再次将代码添加到呼叫功能。 MakeSure你是一个调用方法,否则它的调用是递归循环。

答案 31 :(得分:-2)

在所有答案中,我找到了一个不错的解决方案。实际上,与iOS 12 onword网络连接失败有关的问题是因为iOS 12.0 onword中存在错误。而且它尚未解决。当应用程序来自后台并尝试进行网络调用并建立连接失败时,我经历了与AFNetworking相关问题的git hub社区。我花了三天的时间,尝试了很多方法来找到导致此问题的根本原因,却一无所获。终于,当我给这个博客https://github.com/AFNetworking/AFNetworking/issues/4279

涂上红色时,我在黑暗中有了一点光

这是说iOS 12中存在一个错误。基本上,如果应用程序不在前台,就不能期望网络调用能够完成。由于此错误,网络呼叫被丢弃,我们在日志中发现网络故障。

对于您最好的建议是,当您的应用程序从后台运行到前台并且有网络通话时,请提供一些延迟。在分派异步中进行该网络呼叫会有一些延迟。您将永远不会掉线或掉线。

不要等待Apple让此问题为iOS 12解决,因为它尚未修复。 您可以通过为网络请求的NSURLConnection,NSURLSession或AFNetworking或ALAMOFIRE网络请求提供一些延迟来解决此问题。干杯:)