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

问题描述 投票:251回答:30

我有一个适用于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但仍然收到同样的错误。

ios8 ios-simulator xcode6 xcode6-beta5
30个回答
412
投票

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


3
投票

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


3
投票

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


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;


2
投票

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


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));来重新调用块。


2
投票

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


2
投票

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


2
投票

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

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


1
投票

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


1
投票

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


216
投票

我们遇到了这个确切的错误,结果证明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配置)

1
投票

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

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

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

但是,添加HTTPMethod,连接正常

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

1
投票

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


1
投票

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


1
投票

关于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


0
投票

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

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

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

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

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

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

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


0
投票

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

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


0
投票

我遇到了同样的问题,我已经启用了网络链接调节器,用于应用程序的慢速网络测试。这有时会产生这个错误,当我从Settings > Developer > Network Link Conditioner禁用它时,它解决了我的问题。

enter image description here

希望这能有所帮助。


0
投票

我在使用物理设备从iOS 12应用程序调用我公司的服务器时遇到了同样的问题。问题是服务器硬盘已满。释放服务器中的空间解决了这个问题。

我发现在另一种情况下我发现了相同的错误,因为通过Apple提供的标准网络API(URLSession.timeoutIntervalForRequestURLSession.timeoutIntervalForResource)超时无法参数化。即使那里..使服务器答案更快解决了问题


0
投票

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


-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你是一个调用方法,否则它的调用是递归循环。


47
投票

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

iOS模拟器 - >重置内容和设置 - >按重置(关于将出现的警告)


-2
投票

除了所有的答案,我找到了一个很好的解决方案。实际上iOS 12 onword与网络连接相关的问题是因为iOS 12.0 onword中存在错误。它还没有解决。当应用程序来自后台并尝试进行网络呼叫并且连接建立失败时,我已经通过git hub社区了解AFNetworking相关问题。我花了3天的时间在这上面并尝试了许多事情来找到根本原因而没有发现任何事情。最后,当我在这个博客https://github.com/AFNetworking/AFNetworking/issues/4279上红的时候,我在黑暗中获得了一些亮光

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

我的最佳建议是,当您的应用从后台到前台并且有网络呼叫时,会提供一些延迟。在调度异步中进行网络调用有一些延迟。您永远不会遇到网络掉线或连接丢失。

不要等待Apple让这个问题解决iOS 12,因为它还没有解决。您可以通过为您的网络请求提供一些延迟来实现此解决方案,即NSURLConnection,NSURLSession或AFNetworking或ALAMOFIRE。干杯:)


29
投票

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

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

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


11
投票

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


11
投票

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

Domain = NSURLErrorDomain Code = -1005“网络连接丢失。”

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

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

.

更改为使用https允许从iOS 8模拟器连接,尽管有间歇性错误。

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


10
投票

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

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


9
投票

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

希望这可以帮助!


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

}
© www.soinside.com 2019 - 2024. All rights reserved.