错误域= NSURLErrorDomain代码= -1005“networking连接丢失。”
我有一个应用程序在iOS7和iOS8上都可以在Xcode6-Beta1和Xcode6-Beta2上正常工作。 但与Xcode6-Beta3,Beta4,Beta5我正面临与iOS8的networking问题,但一切工作正常iOS7。 我收到错误"The network connection was lost."
。 错误如下:
错误:错误域= NSURLErrorDomain代码= -1005“networking连接丢失。 UserInfo = 0x7ba8e5b0 {NSErrorFailingURLStringKey =,_kCFStreamErrorCodeKey = 57,NSErrorFailingURLKey =,NSLocalizedDescription =networking连接丢失,_kCFStreamErrorDomainKey = 1,NSUnderlyingError = 0x7a6957e0“networking连接丢失。
我使用AFNetworking 2.x和下面的代码片段来进行networking调用:
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
但仍然收到相同的错误。
重新启动模拟器解决了我的问题。
我们有这个确切的错误,结果是NSURLRequest
的底层HTTP实现的一个问题:
据我们所知,当iOS 8接收到带有Keep-Alive
头部的HTTP响应时,它会保持这个连接以后再使用(应该是这样),但是它保持的timeout
超过了Keep- Alive头,然后当第二个请求到来时,它会尝试重新使用服务器已经丢弃的连接。
以下是我们迄今为止发现的解决scheme:
- 将服务器的超时参数增加到30秒以上。 看起来像iOS总是performance得好像服务器将保持连接打开30秒,而不pipeKeep-Alive头中提供的值如何。 (这可以通过设置
KeepAliveTimeout
选项为Apache完成。 - 您可以简单地根据您的应用程序的User-Agent(例如,Apache:
BrowserMatch "iOS 8\." nokeepalive
- 如果您无法访问服务器,则可以尝试使用
Connection: close
标头发送请求:这将告诉服务器立即删除连接,并在没有任何保持活动标头的情况下进行响应。 但是目前,当发送请求时,NSURLSession似乎覆盖了Connection
头(我们没有广泛地testing这个解决scheme,因为我们可以调整Apache的configuration)
对于我的, Resetting content and settings
模拟器的Resetting content and settings
。 要重置模拟器,请按照以下步骤操作:
iOS模拟器 – >重置内容和设置 – >按重置(关于将发生的警告)
iOS 8.0模拟器运行时有一个错误,如果在模拟设备启动时networkingconfiguration发生变化,模拟运行时中的更高级别的API(例如:CFNetwork)会认为它已经失去了networking连接。 目前,build议的解决方法是在networkingconfiguration更改时简单地重新启动模拟设备。
如果您受到此问题的影响,请在http://bugreport.apple.com上提交额外的重复雷达,以获得更高的优先级。;
如果你在没有改变networkingconfiguration的情况下看到这个问题,那么这不是一个已知的错误,你一定要提供一个雷达,表明这个问题不是已知的networkingconfiguration改变的错误。
什么解决了我的问题是重新启动模拟器,并重置内容和设置。
当在iOS8模拟器上运行导致连接错误“Domain = NSURLErrorDomain Code = -1005”时,beta5和AFNetworking 1.3也出现问题。networking连接丢失。 相同的代码在iOS7和7.1模拟器上正常工作,我的debugging代理显示,在实际尝试连接之前发生了故障(即没有logging请求)。 我跟踪了NSURLConnection的失败并向苹果公司报告了bug。 在附图中看到附加的第5行。 。 更改为使用https允许来自iOS8模拟器的连接,虽然有间歇性错误。 问题仍然存在于Xcode 6.01(gm)中。
查尔斯开放解决了这个问题,这似乎很奇怪…
请参阅Github上1月5日的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; }
也有人build议重新连接到网站,
即触发POST请求TWICE
解决scheme:使用一种方法来连接到站点,返回(id),如果networking连接丢失,返回使用相同的方法。
方法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; } }
我在使用Alamofire时遇到了这个问题。 我的错误是,我发送一个空字典[:]
的GET
请求参数,而不是发送nil
参数。
希望这可以帮助!
我也有这个问题,在iOS 8设备上运行。 这里详细一些,似乎是iOS的尝试使用已经超时的连接的情况。 我的问题与该链接中解释的Keep-Alive问题不一样,但它看起来是相同的最终结果。
我通过运行一个recursion块纠正了我的问题,每当我收到一个错误-1005,这使得连接最终通过即使有时recursion可以循环超过100次连接工作,但它只增加了一秒钟的运行次,我敢打赌,这只是debugging器为我打印NSLog的时间。
以下是我如何使用AFNetworking运行recursion块:将此代码添加到连接类文件
// 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));
使块被再次调用。
如果有人在将file upload到后端服务器时出现此错误,请确保接收服务器的媒体允许的最大内容大小。 就我而言,NGINX需要更高的client_max_body_size
。 在上传完成之前,NGINX会拒绝这个请求,所以没有返回错误代码。
我也得到这个错误,但在实际的设备,而不是模拟器。 我们注意到在HTTPS(gunicorn服务器)上访问我们的heroku后端时出现的错误,以及与大型身体(超过64Kb的任何东西)做POSTS。 我们使用HTTP基本身份validation进行身份validation,并注意到通过在NSURLSession上不使用didReceiveChallenge didReceiveChallenge:
delegate方法解决了错误,而是通过添加了Authentiation: Basic <Base64Encoded UserName:Password>
将Authentiation: Basic <Base64Encoded UserName:Password>
烘焙到原始请求头中。 这可以防止必要的401触发didReceiveChallenge:
委托消息,并且后续的networking连接丢失。
我有同样的问题。 解决scheme很简单,我已经设置HTTPBody
,但没有设置HTTPMethod
POST
。 解决这个之后,一切都很好。
我不得不退出XCode,删除DerivedData文件夹内容(〜/ Library / Developer / Xcode / DerivedData或/ Library / Developer / Xcode / DerivedData)并退出模拟器以使其工作。
当我使用xcode 6.2testing版时,即使在ios7设备上,我也遇到了错误。 从xcode 6.2 beta切换回6.1.1修复了这个问题。 至less在ios7设备上。
如果问题出现在设备上,请检查stream量是否通过代理(设置> Wi-Fi>(信息)> HTTP代理)。 我有我的设备设置使用查尔斯,但忘记了代理。 似乎没有查尔斯实际上运行这个错误发生。
我通过VPN连接。 禁用VPN解决了这个问题。
在将NSURLRequest传递给NSURLSession 而未设置请求的HTTPMethod时,我遇到了这个错误。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL];
错误域= NSURLErrorDomain代码= -1005“networking连接丢失。”
添加HTTPMethod
,但是,连接工作正常
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlComponents.URL]; [request setHTTPMethod:@"PUT"];
testing是否可以从其他应用程序(如safari)请求。 如果没有可能是你的电脑上的东西。 在我的情况下,我遇到了Avast Antivirus的这个问题,它阻止了我的模拟器请求(不要问我为什么)。
重新启动计算机解决了我与Xcode9.1的问题。 我已经重新启动模拟器和Xcode,它不起作用。
得到了这个问题好几个月,终于发现,当我们禁用我们的api域的DNSSEC时,一切正常:simple_smile:
我有这个问题,原因如下。
TLDR:检查你是否发送一个GET
请求,应该是在url上发送参数,而不是在NSURLRequest's HTTBody
属性上。
==================================================
我已经在我的应用程序上安装了一个networking抽象,并且在我的所有请求中工作得很好。
我添加了一个新的请求到另一个Web服务(不是我自己的),它开始抛出我这个错误。
我去了一个操场,从头开始build立一个准系统的请求,它的工作。 所以我开始接近我的抽象,直到find原因。
我的抽象实现有一个错误:我发送了一个请求,该请求应该发送URL中的编码参数,而且我还用查询参数填充了NSURLRequest's HTTBody
属性。 只要我删除了HTTPBody
它的工作。
我收到这个错误,也注意到应用程序邮差也下降,但在应用程序高级rest客户端(ARC)和Android的工作。 所以我不得不安装Charles来debugging通信,我注意到响应代码是-1。 问题是REST程序员忘记了返回响应代码200。
我希望这可以帮助其他开发者。