NSURLConnection的GET请求返回-1005,"网络连接丢失"。

45
我试图在iOS 8 SDK上使用 XCode 6(Beta7 2)中的 NSURLConnection 发起一个简单的 GET 请求,但是它失败了并提示 "Code 1005, the network connection was lost"。当我尝试获取http://www.google.com或网页中的几个其他示例页面时,调用失败,但如果我向本地主机上的简单 HTTP 服务器发出请求(python -m SimpleHTTPServer),则成功。我还尝试使用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
@quellish 我的Mac防火墙已关闭。 - Vikesh
在我的情况下,_kCFStreamErrorCodeKey=57 匹配了请求已发送到服务器,但客户端在服务器返回响应之前离线的状态。在这种失败情况下重试会导致服务器数据库中创建两个相同的记录。不确定是否安全地假设57表示“我已发送完整的请求。即使您现在离线,也可以安全地假定服务器将处理该请求”。 - mixtly87
7个回答

92

最近我看到iPhone 6模拟器的互联网连接出现问题,导致出现了相同的错误。我的Mac电脑可以联网,但模拟器却不能。重新启动模拟器解决了这个问题。


5
事实上,这就是正确的答案!我重新启动了XCode,但从未想过重新启动模拟器。是的,在重新启动模拟器后它可以正常工作!谢谢! - Vikesh
1
当我在使用模拟器时,遇到了这个问题,当时我是在无线网络下,然后切换到了有线连接。我甚至尝试关闭了无线网络。 - Paul Reedy
5
你们有没有关于这个问题提交雷达反馈?在 Xcode 6.1 版本和 iPhone 6 模拟器中仍然存在该问题。 - mluisbrown
1
重启是最好的策略,诚实之后。 - Ans
你检查了设备吗?如果你正在使用defaultSessionConfiguration和NSURLSessionUploadTask将NSData上传到服务器,当应用程序在后台上传数据并锁定设备时,它会返回相同的错误。看起来像是应用程序在后台运行时失去了互联网连接。我还尝试使用backgroundSessionConfigurationWithIdentifier从filePath更新数据,这次上传在后台持续运行,直到任务完成,一旦任务完成,它不会启动另一个任务,只等待应用程序再次启动。 - Pratik Patel
显示剩余3条评论

10

在iOS 9上,我经常遇到某些网络请求出现错误的情况。其中两个正常工作,但另外两个不行。

后来发现是因为我在请求体中传递了一些错误的参数导致的... 我没有想到这会引起-1005错误...但事实证明确实如此...删除不必要的参数后问题得到解决!


你的代码中有哪些不必要的参数?我也遇到了类似的问题。 - Tukkan
很抱歉,我甚至都记不得当时我在开发哪个应用了……但是如果你只对请求应用必要的设置和参数,这可能会有所帮助。例如,如果你没有发送httpBody,请不要设置content-type。 - CMash
这太棒了!我尝试了许多解决方案,但问题在于我传递给请求的参数。谢谢你的提示!! :) @CMash - Sagar Unagar

2
我在谷歌上尝试了至少15个答案,但没有一个解决我的问题,直到我尝试了以下方法才完全解决问题。看起来Mac上的Wi-Fi连接可能会变得损坏,因此如果您删除正在使用的特定连接,然后重新连接(通过选择网络并再次输入密码),则可以解决该问题,并且不会再出现可怕的-1005“网络连接已丢失”错误。
  • 转到Mac菜单栏上的Wi-Fi图标,并“关闭Wi-Fi”
  • 然后选择“打开网络首选项”(从同一菜单中,在底部)。
  • 在网络面板的右下角,选择“高级”。
  • 选择先前连接的网络连接。
  • 点击此表下方的减号符号以删除此连接。
  • 对于此窗口,请单击“确定”。
  • 在网络窗口上点击“应用”。
  • 返回到菜单栏上的Wi-Fi图标,并打开Wi-Fi。
  • 等待您的网络连接出现,然后选择它(现在会再次要求输入密码,因为您删除了连接信息)。
  • 现在它将记住这个新刷新的连接,这应该解决问题!

1
尝试更改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 {
    }];

0

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

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

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


0

我曾经遇到过类似的问题,重启模拟器也没有解决。在我的情况下,我能够交替地访问 Web 服务,奇数次成功,偶数次会出现这个错误。我知道这很奇怪,但事实就是如此。我用以下方法在 Swift 中解决了这个问题:

 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()

-2

简单而实用的解决方案,经过多次测试,完美运行。

//使用状态码检查响应错误,如果收到-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)
                                })
                            }
                 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接