错误域=NSURLErrorDomain Code=-1005 "网络连接丢失"

我有一个应用程序,可以在Xcode6-Beta1和Xcode6-Beta2与iOS7和iOS8上正常工作。但是对于Xcode6-Beta3, Beta4, Beta5,我在iOS8上面临网络问题,但在iOS7上一切都很好。我得到错误"The network connection was lost."。错误如下:

Error: ErrorDomain =NSURLErrorDomain Code=-1005 "The network connection was lost."UserInfo=0x7ba8e5b0 {NSErrorFailingURLStringKey=, _kCFStreamErrorCodeKey=57, NSErrorFailingURLKey=, NSLocalizedDescription=网络连接丢失。, _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x7a6957e0 "The network connection was lost."}

我使用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,但仍然收到相同的错误。

194789 次浏览

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

Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."

同样的代码在iOS 7和7.1模拟器上工作得很好,我的调试代理显示失败发生在连接实际尝试之前(即没有记录请求)。

我已经追踪到NSURLConnection的失败,并向苹果报告了这个错误。见附图第5行:

NSURLConnection client delegate did fail error

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

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

重新启动模拟器解决了我的问题。

我必须退出XCode,删除DerivedData文件夹内容(~/Library/Developer/ XCode /DerivedData或/Library/Developer/ XCode /DerivedData)并退出模拟器才能使其工作。

我们有这个确切的错误,它被证明是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在mod文件setenvif.conf)
  • 如果你不能访问服务器,你可以尝试用Connection: close头发送请求:这将告诉服务器立即放弃连接,并在没有任何keep alive头的情况下进行响应。但是目前,NSURLSession似乎在请求发送时覆盖Connection头(我们没有广泛测试这个解决方案,因为我们可以调整Apache配置)

打开查尔斯为我解决了这个问题,这看起来很奇怪…

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

iOS 8.0模拟器运行时有一个错误,即如果你的网络配置在模拟设备引导时发生变化,模拟运行时中的高级api(例如:CFNetwork)会认为它已经失去了网络连接。目前,建议的解决方案是在网络配置发生变化时重新启动模拟设备。

如果您受到此问题的影响,请在http://bugreport.apple.com文件额外的副本雷达,以提高优先级。

如果你看到这个问题没有改变了网络配置,那么这不是一个已知的错误,你应该明确地文件雷达,表明这个问题不是已知的网络配置改变的错误。

我也有这个问题,在iOS 8设备上运行。 它更详细一些在这里,似乎是一个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));使块被再次调用。

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

iOS Simulator -> Reset Content and Settings ->按“Reset”(在“iOS Simulator”界面上) 将会出现的警告)

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

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

Method1:

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


}

如果问题发生在设备上,检查流量是否通过代理(设置> Wi-Fi > (info) > HTTP代理)。我已经设置好了与Charles一起使用的设备,但忘记了代理。似乎没有Charles实际运行,就会出现这个错误。

这个问题持续了几个月,最后发现当我们在api域中禁用DNSSEC时,一切都ok。

我通过VPN连接。去使能VPN解决了问题。

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

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

当将NSURLRequest传递给NSURLSession 没有设置请求的HTTPMethod时,我遇到了这个错误。

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

ErrorDomain =NSURLErrorDomain Code=-1005 "The network connection was lost."

不过,添加HTTPMethod,连接就可以正常工作了

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

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

希望这能有所帮助!

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

我遇到这个问题的原因如下。

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

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

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

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

我去了一个操场,从最基本的要求开始,它成功了。所以我开始接近我的抽象概念,直到我找到原因。

我的抽象实现有一个错误: 我发送了一个请求,该请求应该发送url中编码的参数,并且我还用查询参数填充了NSURLRequest's HTTBody属性。 只要我删除了HTTPBody,它就工作了

无论何时得到错误-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...
}
}];

您需要再次添加调用函数的代码。确保你是调用方法一次,否则它的调用循环递归。

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

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

enter image description here

希望这能帮助到一些人。

在所有的答案中,我找到了一个很好的解决方案。实际上,iOS 12 onword的网络连接失败的问题是因为iOS 12.0 onword有一个错误。它还没有解决。我已经通过git中心社区的AFNetworking相关问题,应用程序来自后台,试图进行网络调用,但连接建立失败。我花了3天时间在这个问题上,尝试了很多方法来找到问题的根本原因,但一无所获。最后,我得到了一些光明在黑暗中,当我红这个博客https://github.com/AFNetworking/AFNetworking/issues/4279

据说iOS 12系统有漏洞。基本上,如果应用程序不在前台,你就不能期望网络调用完成。由于这个错误,网络呼叫被中断,我们在日志中得到网络故障。

我给你的最好的建议是,当你的应用从后台到前台有网络呼叫时,提供一些延迟。使调度中的网络调用具有一定的延迟。你永远不会得到网络呼叫掉线或连接丢失。

不要等待苹果让这个问题在iOS 12中解决,因为它仍然没有修复。 你可以通过为你的网络请求NSURLConnection, NSURLSession或AFNetworking或ALAMOFIRE提供一些延迟来解决这个问题。欢呼:)< / p >

2017-01-25上,苹果发布了一个关于此错误的技术问答:

苹果技术Q&A QA1941

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

答:NSURLErrorNetworkConnectionLost是NSURLErrorDomain错误域中的错误-1005,并显示给用户为“网络连接丢失”。此错误意味着承载HTTP请求的底层TCP连接在HTTP请求正在进行时断开(有关此的详细信息,请参阅下面)。在某些情况下,NSURLSession可能会自动重试这样的请求(特别是,如果请求是幂等的),但在其他情况下,这是不允许的HTTP标准。

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

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

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

这可能是传递给请求体的参数的问题。我也面临着同样的问题。但后来我在这里遇到了cash的答案https://stackoverflow.com/a/34181221/5867445,我改变了我的参数,它工作了。

我传递的参数中的问题是关于String Encoding的。

希望这能有所帮助。

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

我也有同样的问题,问题是Alomofire和NSUrlSession的bug。当你从safari或电子邮件返回到应用程序时,你需要等待近2秒才能通过Alamofire进行网络响应

 DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
Your network response
}