我有一个可以在Xcode6-Beta1和Xcode6-Beta2以及iOS7和iOS8上正常运行的应用程序。但是对于Xcode6-Beta3,Beta4,Beta5,我遇到了iOS8的网络问题,但在iOS7上一切正常。我收到错误"The network connection was lost."。错误如下:


错误:错误Domain = 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上发生,仍在尝试寻找解决方法。

stackoverflow.com/questions/25994608/…

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

iOS 10.0.1和Xcode 8面临相同的问题。

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

#1 楼

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

评论


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

–塞恩·克拉克(Sean Clark)
2014年12月5日18:41

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

–亚瑟
2014-12-18在10:09



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

– KingPolygon
15年1月29日在8:05

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

– noobsmcgoobs
2015年2月11日下午6:08

重置模拟器对我不起作用。然而,开始查尔斯使问题消失了。请参阅stackoverflow.com/a/26066764/598057,其中建议使用Charles。很奇怪,但是可以...

–斯坦尼斯拉夫·潘克维奇(Stanislav Pankevich)
16年5月17日在11:50

#2 楼

我们遇到了这个确切的错误,事实证明这与NSURLRequest的基本HTTP实现有关:

据我们所知,iOS 8/9/10/11何时收到带有一个Keep-Alive标头,它将保持该连接以供以后重用(应按要求使用),但是它保持连接的时间超过Keep-Alive标头的timeout参数(它似乎总是使连接保持30秒)。 br />然后,当应用在不到30秒后发送第二个请求时,它将尝试重新使用服务器可能已丢弃的连接(如果超过了实际的Keep-Alive)。

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


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


评论


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

– Dimillian
2014-09-23 15:25



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

–ptc
2014-09-24 23:54



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

– Andres C
2014年10月9日14:08



提示:您可以使用NSURLErrorNetworkConnectionLost常量,而不是硬编码-1005。

– Vincent Tourraine
2015年4月9日在9:47

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

–马卡莱勒
18 Mar 15 '18在11:44

#3 楼

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


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


评论


对于iOS 14:设备>清除所有内容和设置...

– C13
10月5日16:53

#4 楼

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

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

如果您在未更改网络配置的情况下看到此问题,则说明该错误不是已知的错误,因此您应该提出雷达通知,以表明该问题不是已知的网络-配置更改的错误。

评论


我在设备上也遇到这个问题。

–达伦
2014-09-30 12:49

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

–杰里米·哈德斯顿红杉
2014-09-30 20:42



请附上您的雷达ID,以便更轻松地进行重复归档

–丹尼尔·加拉斯科(Daniel Galasko)
2014年11月6日在8:37

#5 楼

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

评论


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

–弗拉基米尔·斯拉维克(VladimírSlavík)
2015年10月29日在10:18

#6 楼

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


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


相同的代码在iOS 7和7.1模拟器上也能正常工作,并且我的调试代理显示失败是在实际尝试连接之前发生的(即未记录任何请求)。 br />我已经跟踪了NSURLConnection的失败并将错误报告给了Apple。请参阅所附图片中的第5行:



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

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

评论


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

– VoidStack
2014年8月25日18:11

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

–ptc
14年8月26日在21:04

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

–szuniverse
2014年9月3日19:59

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

–ptc
2014年9月4日在21:28

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

– VoidStack
2014年9月5日在22:53

#7 楼

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

希望这会有所帮助!

评论


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

–马哈茂德·法耶兹(Mahmoud Fayez)
18-09-19在18:23



#8 楼

打开Charles对我来说解决了这个问题,这似乎很奇怪...


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


评论


这也对我有用,我认为因为查尔斯使用ssl证书来代理求和器请求,所以它执行与使用https相似的技巧

–thisispete
14-10-28在19:07



每次都对我有用!已经尝试了30次,它在30中有30起作用。我认为这是it幸,但很高兴知道这不是我。

– jdog
2014年11月6日6:11



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

–科林·特伦布莱
15年6月15日在19:56

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

–bikram990
16年7月13日在6:51

可笑的是,这也对我有用。需要打开Charles,然后重置iOS Simulator设置。

–马特·安德鲁斯(Matt Andrews)
16年8月9日在10:20

#9 楼

请参阅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请求TWICE

解决方案:使用一种方法建立到站点的连接,返回(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
17年6月16日在14:26

#10 楼

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

评论


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

– Vinayak Bhor
18年6月22日在15:02

#11 楼

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

#12 楼

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

评论


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

–甘兰汗(Kamran Khan)
18年6月4日在9:13

#13 楼

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

评论


该列表中唯一相关的操作是重新启动模拟器。重新启动Xcode并删除派生数据过多。

–杰里米·哈德斯顿红杉
2014年9月29日19:26

#14 楼

我也在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年11月17日在20:06

它只是一个AFHTTPRequestOperation子类。我用它来预定义超时和身份验证之类的东西。

–达伦
2014年11月17日在20:14

#15 楼

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

#16 楼

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

#17 楼

当我使用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年11月23日14:11



#18 楼

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

Apple技术问答QA1941
处理“网络连接丢失”错误
A:NSURLErrorDomain中的NSURLErrorNetworkConnectionLost为错误-1005错误域,并显示为“网络连接丢失”。此错误表示正在进行HTTP请求时,承载HTTP请求的基础TCP连接已断开连接(有关此信息,请参见下文)。在某些情况下,NSURLSession可以自动重试此类请求(特别是在请求是幂等的情况下),但在其他情况下,HTTP标准不允许。
https://developer.apple.com/library/archive/qa/ qa1941 / _index.html#// apple_ref / doc / uid / DTS40017602


#19 楼

解决了几个月的问题,最后发现,当我们在api域上禁用DNSSEC时,一切都很好:simple_smile:

评论


您能详细说明一下吗?

– Groot
15年8月24日在22:08

#20 楼

我正在通过VPN连接。禁用VPN解决了该问题。

#21 楼

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

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



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


尽管添加了HTTPMethod,但连接工作正常

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


#22 楼

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

#23 楼

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

#24 楼

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


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

#25 楼

我遇到了同样的问题,
我启用了Network Link Conditioner,以便对该应用进行缓慢的网络测试。有时是在创建此错误,
当我从Settings > Developer > Network Link Conditioner禁用它时,它解决了我的问题。



希望这个帮助某人。

#26 楼

在所有答案之上,我找到了一个不错的解决方案。实际上,与网络连接失败有关的iOS 12 onword问题是因为iOS 12.0 onword中存在错误。而且它尚未解决。当应用程序来自后台并尝试进行网络调用并建立连接失败时,我经历了与AFNetworking相关问题的git hub社区。我花了3天的时间,尝试了很多方法以找出造成此问题的根本原因,但没有发现任何问题。最终,当我将此博客添加为红色时,我得到了黑暗的曙光https://github.com/AFNetworking/AFNetworking/issues/4279

这就是说iOS 12中存在错误。如果应用程序不在前台,则不能期望网络调用能够完成。而且由于该错误,网络调用被丢弃,我们在日志中发现网络失败。

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

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

#27 楼

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

#28 楼

我的问题是在服务器上。我正在使用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'') 
 


#29 楼

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

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

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

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

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

我去了一个操场,从头开始建立准系统的请求,它奏效了。所以我开始接近抽象,直到找到原因。
我的抽象实现有一个错误:
我正在发送一个请求,该请求应该发送在url中编码的参数,因此也用查询参数填充了NSURLRequest's HTTBody属性。
我删除HTTPBody后就可以使用。

#30 楼

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

希望对其他开发人员有所帮助。