Error Domain = NSURLErrorDomain代码= -1005“网络连接丢失。”


268

我有一个可以在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但仍然收到相同的错误。


任何更新 ?对于我来说,这仅发生在Wifi上的iOS 8上,仍在尝试寻找解决方法。
Dimillian 2014年


谁能帮助我解决我的问题,几乎是同一问题,但错误代码不同, stackoverflow.com
questions/26972822/…

1
面对与iOS 10.0.1和Xcode 8相同的问题
。– Satheeshwaran

1
今天早上我收到了这个错误,并通过一个简单而怪异的解决方案立即修复了该错误。请求的服务器地址错误,没有返回4xx或5xx状态代码,它刚遇到此问题,不确定根本原因是什么。因此,请与您团队中的后端开发人员确认,否则您将花费​​数小时。
Itachi 2016年

Answers:


414

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


3
如果此问题出现在设备而非SIM卡上,该怎么办?尝试重新启动设备,仍然是同样的错误。
肖恩·克拉克

2
@SeanClark:请参阅下一个答案:重新启动模拟器是可行的,因为操作系统需要删除死连接,而不是在服务器删除它们后尝试重新使用它们。要变通解决此问题,您可以为iOS客户端禁用服务器上的Keep-alive机制,或者,如果您无权访问服务器,则可以在失败时再次尝试相同的请求(失败应操作系统断开连接,并在重试发送时实例化一个新的连接)。
亚瑟

我当前正在使用Xcode 6.2,解决该问题的方法是单击iOS Simulator>重置设置和内容。完成后,我退出模拟器,重新构建并运行我的项目……此后一切都运行良好。
KingPolygon 2015年

对我来说,重置模拟器很有用,但是只有10%的时间。我刚得到一个新的ISP,它运行起来有点奇怪。现在,这种情况一直在模拟器上发生。可能是网络。
noobsmcgoobs 2015年

1
重置模拟器对我不起作用。然而,开始查尔斯使问题消失了。请参阅stackoverflow.com/a/26066764/598057,其中建议使用Charles。非常奇怪,但是有效……
Stanislav Pankevich '16

231

我们遇到了这个确切的错误,事实证明这是底层HTTP实现的问题NSURLRequest

据我们所知,在iOS的8/9/10/11收到一个HTTP响应Keep-Alive头,后来一直就此重新使用(因为它应该),但它保持它超过timeout的参数Keep-Alive标头(它似乎总是使连接保持活动状态30秒。)然后,当应用程序在不到30秒后发送第二个请求时,它将尝试重用服务器可能已断开的连接(如果已超过实际值Keep-Alive)。

这是到目前为止我们找到的解决方案:

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

7
这是一个演示该问题的示例项目,一个错误报告也已提交给Apple。cl.ly/Xgkl/keep-alive-fail.zip启动项目,单击第一个发布按钮(屏幕顶部),等待5秒钟,再次单击它,错误。
Dimillian 2014年

5
保持活动是双边的。客户端默认会添加一个HTTP标头“ Connection:Keep-Alive”,在客户端请求上添加keep-alive参数可能会有所帮助;例如“ Keep-Alive:max = 1”。Arthur的评论非常有帮助,但也指出了iOS8模拟器网络中的多个问题。我必须使用https来获得连接,因为http发送请求之前失败。
ptc 2014年

5
大家好,我在设备上遇到了同样的问题。有解决办法吗?但是在iOS 7上没有问题。
2014年

9
提示:您可以使用NSURLErrorNetworkConnectionLost常量代替硬编码-1005
Vincent Tourraine

6
此问题在iOS 11.2.6上仍然存在。
Makalele


29

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

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

如果您在更改网络配置的情况下看到此问题,则说明该错误不是已知的错误,因此您一定要提交雷达报告,表明该问题不是已知的更改网络配置的错误。


7
我在设备上也遇到这个问题。
达伦(Darren)2014年

@darren然后,这不是我所指的问题。我建议你提起雷达。
Jeremy Huddleston Sequoia 2014年

4
请提供您的雷达ID,以使归档重复文件更加轻松
Daniel Galasko 2014年

11

对我来说解决问题的是重新启动模拟器,并重置内容和设置。


它还有助于在重置模拟器之前杀死该应用程序并重新启动Mac。我经常更改带有不同wifi地点的地点,这是为我解决问题的过程。
弗拉基米尔·斯拉维克

11

在iOS 8模拟器上运行时,beta 5和AFNetworking 1.3也存在问题,导致连接错误:

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

相同的代码可以在iOS 7和7.1仿真器上正常工作,并且我的调试代理显示失败是在实际尝试连接之前发生的(即未记录任何请求)。

我已跟踪到NSURLConnection的故障,并将错误报告给了Apple。请参阅所附图片中的第5行:

NSURLConnection客户端委托确实失败错误

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

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


我在NSURLSession和NSURLConnection上看到了同样的问题,这排除了AFNetworking的问题。我也发现它可以与https一起使用,而不能与http一起使用。我仍然找不到任何解决方案,您有解决方案吗?
VoidStack

没有解决方案报告为错误(18072300)将添加有关https工作的注释,这是很好的信息。
ptc

您可以在此处粘贴错误链接吗?谢谢,因为我想我也有同样的问题,但是我只使用NSURLConnection(和委托),但是却收到了相同的错误消息
szuniverse 2014年

无法分享Apple错误报告。仍处于打开状态,并且仍存在于XCODE 6 beta 7中。如果您提交错误报告,还将有助于优先级。
ptc

看来这个问题是在iOS模拟器上出现的,我对实际的设备感到厌倦,它可以正常工作。我发现进一步的调试是关于iOS模拟器上的端口的问题,https端口443可以正常工作,而我使用8080来访问曾经失败的http。我尝试使用其他端口,并能够在iOS模拟器上进行http调用。就像在测试的Xcode 6错误的容貌,需要等待稳定的Xcode 6
VoidStack

10

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

希望这可以帮助!


带有空正文字典[:]的GET和POST将随机导致此错误。我将Python Flask用于后端REST API,这可能也很有用。
Mahmoud Fayez

10

打开Charles帮我解决了这个问题,这似乎很奇怪。

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


1
这也对我有用,我认为因为查尔斯使用ssl证书代理汇总器请求它执行与使用https类似的技巧
thisispete 2014年

1
每次都对我有用!尝试了30次,它能在30中占30。我以为是fl幸,但很高兴知道这不是我。
jdog 2014年

2
Charles是一种代理工具,可让您查看来自计算机的流量。有关详细信息,请访问charlesproxy.com。Charles SSL证书可能会破坏模拟器发出网络请求的能力。
Colin Tremblay 2015年

@ColinTremblay我认为您的模拟器/设备已配置为使用代理。删除代理也将起作用。
bikram990

可笑的是,这也对我有用。需要打开Charles,然后重置iOS Simulator设置。
马特·安德鲁斯

6

请参阅1月5日在Github上的pjebs评论。

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

}

方法1对我有很大帮助。.谢谢
Abhishek Mitra

4

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


非常感谢您的宝贵意见。您是对的,如果我在64 kb图片的base64字符串以下上传,它将成功上传。
Vinayak Bhor


3

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

在我的应用程序从safari追溯并发布http请求后,将出现“ http加载失败1005”错误。如果我停止使用"[NSURLSession sharedSession]",而是使用可配置的NSURLSession实例按如下方式调用“ dataTaskWithRequest:”方法,则问题已解决。

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

只记得设置config.URLCache = nil;


1
我认为所有那些重启设备/模拟器或重置数据的人都应该考虑这个答案。对我来说,他们的所有动作似乎都清除了实际上可以解决该问题的缓存。因此,它可能是URL缓存问题。我现在要对其进行测试。
卡姆兰·汗

2

我必须退出XCode,删除DerivedData文件夹中的内容(〜/ Library / Developer / Xcode / DerivedData或/ Library / Developer / Xcode / DerivedData),然后退出模拟器才能使其正常工作。


1
该列表中唯一相关的操作是重新启动模拟器。重新启动Xcode并删除派生数据过多。
杰里米·哈德斯顿红杉2014年

2

我在iOS 8设备上运行时也遇到此问题。这里有更多详细信息,似乎是iOS尝试使用已超时的连接的一种情况。我的问题与该链接中说明的“保持活动”问题不同,但是最终结果似乎相同。

我已经通过在遇到错误-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));以使该块再次被调用。


什么是MyAFHTTPRequestOperation类?
jdog 2014年

它只是一个AFHTTPRequestOperation子类。我用它来预定义超时和身份验证之类的东西。
达伦(Darren)2014年

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设备上解决了该问题。


我认为没有什么要解决的:底层操作系统出于合法或不合法的原因而断开连接。一个应用程序应该准备好处理它(脱机工作或其他方式)。假设您的特定xcode版本中的SDK当然不是错误的:正如我的回答所示,6.2很有可能是错误,而6.1.1是好的。当xcode 6.4似乎相当稳定,而7.0.1是alpha级软件时,现在可以观察到类似的情况。大概是这样。
Anton Tropashko 2015年

2

2017-01-25Apple上针对此错误发布了技术问答:

苹果技术问答QA1941

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

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

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


1

这个问题困扰了几个月,最后发现,当我们在api域上禁用DNSSEC时,一切正常:simple_smile:


2
您能详细说明一下吗?
Groot


1

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

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

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

HTTPMethod不过,添加,然后连接正常

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

1

测试您是否可以从其他应用(例如野生动物园)中请求。如果没有,则可能是您的计算机上有东西。就我而言,我遇到了Avast Antivirus的问题,该问题阻止了我的模拟器请求(不要问我为什么)。


1

重新启动计算机,使用Xcode9.1为我解决了该问题。我已经重新启动了模拟器和Xcode,它不起作用。


1

我遇到了同样的问题,我已经启用了Network Link Conditioner,以便对该应用进行缓慢的网络测试。那是在某些时候造成这个错误,当我从禁用它时Settings > Developer > Network Link Conditioner,它解决了我的问题。

在此处输入图片说明

希望这对某人有帮助。


1

就我而言,这是因为我正在连接到HTTP并且它正在HTTPS上运行


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

每当出现错误-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... 
       }
  }];

您需要再次添加代码以调用函数。确保您曾经是调用方法,否则将调用递归循环。


0

在所有答案之上,我找到了一个不错的解决方案。实际上,与网络连接失败有关的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网络请求提供一些延迟来解决此问题。干杯:)


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.