NSURLConnection GET 请求返回 -1005,“网络连接丢失”

Posted

技术标签:

【中文标题】NSURLConnection GET 请求返回 -1005,“网络连接丢失”【英文标题】:NSURLConnection GET request returns -1005, "the network connection was lost" 【发布时间】: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 上的防火墙已关闭。 Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."的可能重复 在我的例子中,_kCFStreamErrorCodeKey=57 匹配请求已发送到服务器的状态,但在服务器将响应发送回客户端之前客户端已脱机。重试这种失败会导致在服务器数据库中创建两个相同的记录。不确定假设 57 表示“我发送了整个请求”是否安全。即使您现在下线,您也可以放心地假设服务器会处理该请求。 【参考方案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)
                                )
                            
                 

【讨论】:

以上是关于NSURLConnection GET 请求返回 -1005,“网络连接丢失”的主要内容,如果未能解决你的问题,请参考以下文章

NSURLConnection 发送 GET 请求而不是 POST 请求

NSURLConnection发送GET请求

OC -网络请求 - NSURLConnection - GET

NSURLConnection使用

ios开发网络学习:一:NSURLConnection发送GET,POST请求

iOS开发 GET、POST请求方法(NSURLConnection篇)