错误域= NSURLErrorDomain代码= -1005"网络连接丢失."

Voi*_*ack 258 ios-simulator xcode6 ios8 xcode6-beta5

我有一个适用于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);
      }];
Run Code Online (Sandbox Code Playgroud)

我试过NSURLSession但仍然收到同样的错误.

Col*_*lin 413

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

  • 如果这个问题出现在设备而不是SIM卡上,会发生什么?尝试重启设备,仍然是同样的错误. (3认同)
  • @SeanClark:看下一个答案:重新启动模拟器是有效的,因为操作系统需要删除死连接,而不是在服务器丢弃它们之后尝试重新使用它们.要解决此问题,您可以在服务器上为iOS客户端禁用保持活动机制,或者,如果您无权访问服务器,则可以在失败时再次尝试相同的请求(失败应该使操作系统删除连接,并在发送重试时实例化一个新连接. (2认同)

Art*_*hur 222

我们遇到了这个确切的错误,结果是基础HTTP实现的问题NSURLRequest:

据我们所知,当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在mod文件中setenvif.conf)
  • 如果您无权访问服务器,则可以尝试使用Connection: close标头发送请求:这将告诉服务器立即断开连接并在没有任何保持活动标头的情况下进行响应.但是目前,NSURLSession似乎Connection在发送请求时覆盖了标头(我们没有广泛地测试这个解决方案,因为我们可以调整Apache配置)

  • 提示:您可以使用`NSURLErrorNetworkConnectionLost`常量而不是硬编码`-1005`. (9认同)
  • 这是一个展示问题的示例项目,也向Apple提交了错误报告.http://cl.ly/Xgkl/keep-alive-fail.zip启动项目,单击第一个帖子按钮(屏幕顶部),等待5秒钟,再次单击它,错误. (7认同)
  • 此问题仍出现在iOS 11.2.6上. (6认同)
  • 保持活力是双边的.客户端默认会添加一个http标头"Connection:Keep-Alive",在客户端请求中添加keep-alive参数可能有所帮助; 例如"Keep-Alive:max = 1".Arthur的评论非常有用,但也表明了iOS8模拟器网络中的1个以上问题.在发送请求之前,我必须使用https来获取连接,因为http失败了. (5认同)
  • 嘿伙计们,我在设备上遇到了同样的问题.有没有解决这个问题?但iOS 7上没有问题. (5认同)
  • 如果我们无法访问服务器端,我们可以在应用程序方面做些什么来解决这个问题吗? (3认同)
  • 我有同样的问题,但直接进入macOS应用程序(不是iOS模拟器).一旦我在服务器上将"TIMEOUT"值从30秒更改为60秒,问题就消失了. (3认同)
  • 我可以确认@Kaili.在尝试访问Amazon S3存储桶时,我在设备上也遇到此问题. (2认同)
  • 另一个客户端解决方法(对于那些不能或不会更改其服务器配置的人)检查故障块的NSError对象是否具有代码-1005,这表明发生了此问题.然后您可以简单地重试网络操作,因为这次iOS将重新连接.我还添加了一个重试计数器,以确保此变通方法不会以无限循环结束. (2认同)

Man*_*Mal 47

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

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


Jer*_*oia 29

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

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

如果你在没有改变网络配置的情况下看到这个问题,那么这不是一个已知的错误,你肯定应该提交雷达,表明问题不是已知的网络配置改变的错误.

  • 我也在设备上遇到这个问题. (6认同)
  • 请包括您的雷达ID,以便更轻松地复制备案 (4认同)

ptc*_*ptc 11

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

Domain = NSURLErrorDomain Code = -1005"网络连接丢失."

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

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

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

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

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

  • 这似乎出现在Xcode 6 GM中. (2认同)

m.e*_*iry 11

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


Col*_*lay 10

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

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

  • Charles是一种代理工具,可让您监控来自计算机的流量.有关详细信息,请访问http://www.charlesproxy.com.Charles SSL证书可能会影响模拟器发出网络请求的能力. (2认同)

yuj*_*ean 9

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

希望这可以帮助!


pka*_*amb 8

2017-01-25了有关此错误的技术问答:

\n
\n

苹果技术问答 QA1941

\n

处理\xe2\x80\x9c网络连接丢失\xe2\x80\x9d错误

\n

答:NSURLErrorNetworkConnectionLost 在 NSURLErrorDomain 错误域中为错误 -1005,向用户显示为 \xe2\x80\x9c网络连接丢失\xe2\x80\x9d。此错误意味着在 HTTP 请求正在进行时,\xe2\x80\x99s 承载 HTTP 请求的底层 TCP 连接已断开(有关此问题的更多信息,请参阅下文)。在某些情况下,NSURLSession 可能会自动重试此类请求(特别是,如果请求是幂等的),但在其他情况下,\xe2\x80\x99s 是 HTTP 标准不允许的。

\n

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

\n
\n


HDd*_*per 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;
}
Run Code Online (Sandbox Code Playgroud)

还有人建议重新连接到该网站,

两次发送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;
     }

}
Run Code Online (Sandbox Code Playgroud)


rvi*_*007 5

我也遇到了这个错误,但是是在实际设备而不是模拟器上。我们在 HTTPS(gunicorn 服务器)上访问 heroku 后端以及使用大型正文(任何超过 64Kb 的内容)执行 POSTS 时注意到错误。我们使用 HTTP Basic Auth 进行身份验证,并注意到错误是通过不在didReceiveChallenge:NSURLSession 上使用委托方法解决的,而是通过添加Authentiation: Basic <Base64Encoded UserName:Password>. 这可以防止触发didReceiveChallenge:委托消息所必需的 401,以及随后的网络连接丢失。