【发布时间】: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