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 请求
OC -网络请求 - NSURLConnection - GET