【问题标题】:NSURLConnection GET request returns -1005, "the network connection was lost"NSURLConnection GET 请求返回 -1005,“网络连接丢失”
【发布时间】:2014-11-05 23:40:37
【问题描述】:

我正在尝试在 iOS 8 SDK 上的 XCode 6 (Beta7 2) 中使用 NSURLConnection 发出一个简单的 GET 请求,但由于“代码 1005,网络连接丢失”而失败。当我尝试从 Web 获取 http://www.google.com 或其他一些示例页面时,调用失败,但如果我向 localhost (python -m SimpleHTTPServer) 上的简单 HTTP 服务器发出请求,则调用成功。我也尝试过使用AFNetworking 库(2.4.1) - 使用 NSURLConnection 失败的 URL 也会因库而失败。

这是我的代码 -

NSString * url = @"http://0.0.0.0:8000";
// NSString * url = @"http://www.google.com";

NSLog(@"URL : %@", url);

// Mutable is probably not required, but just in case it REALLY WANTS me to set HTTP method
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[theRequest setHTTPMethod:@"GET"];

NSURLResponse *urlResponse = nil;
NSError *error = nil;

NSData * data = [NSURLConnection sendSynchronousRequest:theRequest
                                      returningResponse:&urlResponse
                                error:&error];

if (error == nil) {
    NSString *response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(response);
} else {
    NSString *response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(@"%@", [error userInfo]);
}

日志:

2014-09-11 17:34:23.950 SearchExample[5092:2074687] URL : http://www.google.com
2014-09-11 17:34:24.023 SearchExample[5092:2074687] {
    NSErrorFailingURLKey = "http://www.google.com";
    NSErrorFailingURLStringKey = "http://www.google.com";
    NSLocalizedDescription = "The network connection was lost.";
    NSUnderlyingError = "Error Domain=kCFErrorDomainCFNetwork Code=-1005 \"The network connection was lost.\" UserInfo=0x7fc8515640a0 {NSErrorFailingURLStringKey=http://www.google.com/, NSErrorFailingURLKey=http://www.google.com/, _kCFStreamErrorCodeKey=57, _kCFStreamErrorDomainKey=1, NSLocalizedDescription=The network connection was lost.}";
    "_kCFStreamErrorCodeKey" = 57;
    "_kCFStreamErrorDomainKey" = 1;
}
2014-09-11 17:34:24.023 SearchExample[5092:2074687] URLResponse: (null)

【问题讨论】:

  • kCFStreamErrorDomainKey 1 是 POSIX 域,这意味着 kCFStreamErrorCodeKey 57 是“套接字未连接”。您 Mac 上的防火墙是否不允许 Xcode/模拟器进行外部连接?
  • @quellish 我的 Mac 上的防火墙已关闭。
  • 在我的例子中,_kCFStreamErrorCodeKey=57 匹配请求已发送到服务器的状态,但在服务器将响应发送回客户端之前客户端已脱机。重试这种失败会导致在服务器数据库中创建两个相同的记录。不确定假设 57 表示“我发送了整个请求”是否安全。即使您现在下线,您也可以放心地假设服务器会处理该请求。

标签: ios cocoa-touch


【解决方案1】:

我最近看到 iPhone 6 模拟器上的互联网连接失败,导致同样的错误。我的 Mac 有一个可用的互联网连接,而模拟器没有。重启模拟器解决了这个问题。

【讨论】:

  • 这其实是正确的答案!我重新启动了 XCode,但不知何故从未想过重新启动模拟器。是的,重启模拟器后就可以了!谢谢!
  • 当我在无线上使用模拟器时发生这种情况,然后切换到有线连接。我什至尝试关闭无线。
  • 你们有没有人为此提交过雷达? Xcode 6.1 和 iPhone 6 模拟器仍在发生这种情况。
  • @Ben-G 正如对this SO question 的回答和cmet 中提到的同样的问题,一些雷达已经提交。
  • 诚实后重启是最好的策略。
【解决方案2】:

我在 iOS 9 上通过某些网络调用一直收到此错误。两个工作正常,但另外两个不行。

原来是由我在请求正文中传递的一些不正确的参数引起的……我没想到会导致 -1005 错误……但它确实发生了……摆脱不必要的参数一切顺利!

【讨论】:

  • 代码中这些不必要的参数在哪里?我面临着类似的问题。
  • 恐怕我什至不记得我当时正在开发什么应用程序......但如果您只将必要的设置和参数应用于您的请求,它可能会有所帮助。例如,如果您不发送 httpBody,请不要设置内容类型
  • 这太棒了!我尝试了许多解决方案,但问题出在我传递给请求的参数中。谢谢你的提示!! :) @CMash
【解决方案3】:

我已经尝试了至少 15 个来自 Google 的答案所建议的所有内容,但其中没有一个解决了我的问题,直到我尝试了以下完全解决了我的问题的方法。看来,Mac 上的 Wi-Fi 连接可能会损坏,因此如果您删除正在使用的特定连接,然后再次连接(通过选择网络并再次输入密码),那么这将解决问题并且不再害怕 -1005 “网络连接丢失”错误。

  • 转到 Mac 菜单栏上的 Wi-Fi 符号并“关闭 Wi-Fi”
  • 然后选择“打开网络首选项”(从同一菜单的底部)。
  • 在“网络”面板的右下角,选择“高级”。
  • 选择您之前连接的网络连接。
  • 点击此表正下方的减号可删除此连接。
  • 为此窗口点击“确定”。
  • 在“网络”窗口中点击“应用”。
  • 返回菜单栏上的 Wi-Fi 符号并重新打开 Wi-Fi。
  • 等待您的网络连接出现,然后选择它(现在它会再次要求输入密码,因为您删除了连接信息)。
  • 它现在会记住这个新刷新的连接,应该可以解决问题!

【讨论】:

    【解决方案4】:

    尝试在 AFNetworking http 或 json 中更改请求序列化。就我而言,那是json,然后我设置为http。现在可以了。

    [[VTNetworkingHelper sharedInstance] performRequestWithPath:@"Your url  " withAuth:YES forMethod:@"POST" withRequestJSONSerialized:NO withParams:params withCompletionHandler:^(VTNetworkResponse *response) {
                if (response.isSuccessful) {
        }else {
        }];
    

    【讨论】:

      【解决方案5】:

      我观察到当您保持模拟器处于活动状态并且您的 Mac 长时间进入睡眠状态(例如 5 到 10 小时)时会出现此问题。然后突然你在模拟器上运行应用程序,它显示日志为

      NSURLConnection GET request returns Code=-1005 "The network connection was lost."
      

      解决办法是简单地退出模拟器清理项目重新运行项目。 这对我有用!

      【讨论】:

        【解决方案6】:

        我遇到了类似的问题,重新启动模拟器不起作用。在我的情况下,我能够像在奇数时间一样访问网络服务,它会成功,而在偶数时间它会向我抛出这个错误。我知道这很奇怪,但不知何故就是这样。迅速用以下方法解决了它:

         let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
                        urlconfig.timeoutIntervalForRequest = 1
                        urlconfig.timeoutIntervalForResource = 1
                        let session = NSURLSession(configuration: urlconfig)
        
                        let task = session.dataTaskWithRequest(request){(data,response,error) in
            //Processing
            }
         task.resume()
        

        【讨论】:

          【解决方案7】:

          简单的示例解决方案,经过多次测试,完美运行。

          //使用状态码检查响应错误,如果得到-1005则再次调用该api。

                          if let strErrorReasonCode : Int = response.response?.statusCode {
                                     if authentication_Errors_Range.contains(Alamofire_Error) {
                                          self.POST(urlString, paramaters: paramaters, showLoader: showLoader, success: { (responseObject) in
                                              if response.result.isSuccess {
                                                  if let value = response.result.value {
                                                      let dictResponce = self.isValidated(value as AnyObject)
                                                      if dictResponce.0 == true {
                                                          success(dictResponce.1)
                                                      }
                                                      else {
                                                          failure(dictResponce.1)
                                                      }
                                                  }
                                              }
                                          }, failure: {_ in
                                              failure(jsonResponce)
                                          })
                                      }
                           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-22
            • 2015-12-27
            • 2014-09-03
            • 2013-09-02
            • 2015-07-27
            • 2017-11-06
            • 1970-01-01
            • 2019-10-12
            相关资源
            最近更新 更多