【问题标题】:Server Unreachable Errors with NSURLSessionNSURLSession 导致服务器无法访问的错误
【发布时间】:2015-02-18 09:49:31
【问题描述】:

自从 iOS 7 首次发布以来,我一直在我的应用程序中使用 NSURLSession。最近一些用户开始抱怨某些功能无法正常工作,在深入查看他们的日志后,我注意到有几个网络请求失败并出现错误:

{NSLocalizedDescription=服务器无法访问。检查您的网络连接并重试。, NSUnderlyingError=0x174c4c300 "操作无法完成。(NSURLErrorDomain 错误 -1001.)"}

由于我不知道问题可能是什么,所以我添加了一些代码来在请求失败时解析主机名:

NSString *urlString = [url host];
const char *hostUrl = [urlString UTF8String];
struct hostent *remote_entity = gethostbyname(host);
if (!remote_entity) {
    DDLogWarn(@"DNS Lookup failed! Cant resolve Hostname: %@ for request: %@", [url host], [url description]);
    return nil;
}
else {
    // Get address info from host entry
    struct in_addr *remote_in_addr = (struct in_addr *) remote_entity->h_addr_list[0];
    char *sremote_in_addr = inet_ntoa(*remote_in_addr);
    NSString* hostIP = [NSString stringWithUTF8String:sremote_in_addr];
    DDLogWarn(@"Hostname: %@ IP: %@ (original request: %@)", [url host], hostIP, [url description]);
    return hostIP;
}

部署此更改后,我可以在日志中看到即使请求失败(带有 NSURLErrorDomain 错误 -1001)我仍然可以解析主机名。

我不明白这是怎么发生的,我总是可以解析主机名,但请求仍然以某种方式失败。请注意,我无法重现此问题,而且此错误只是不时出现,没有可预测的模式。

关于如何永久解决此问题的任何想法?我应该在我的应用程序中实现数据包跟踪机制(类似于 unix 上的 traceroute)吗?这可能是我的服务器上的错误配置,因为对其他主机(如 Amazon S3)的请求永远不会失败?顺便说一句,我正在使用 Heroku。

提前致谢, 泽

【问题讨论】:

    标签: ios heroku dns nsurlsession


    【解决方案1】:

    我建议查看 Apple 的 Networking Overview Guide,特别是 Handling Network Problems Gracefully 部分。

    使用网络代码时,您必须考虑到有时会出错的事实。在蜂窝连接可以来来去去的移动设备上尤其如此。在上述处理网络问题的部分中,Apple 提出了使用SCNetworkReachability API 自动重试请求和检测网络更改的建议。我建议在您的网络代码中使用该策略,以便为您的用户提供最佳体验。

    在您的具体情况下,-1001 错误似乎是 indicating a network timeout。主机查找成功,但无论出于何种原因,网络请求都没有到达服务器。在这种情况下,重试是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2011-01-01
      • 2018-10-14
      • 2014-07-07
      • 1970-01-01
      相关资源
      最近更新 更多