gpt4 book ai didi

ios - NSURLSession 的服务器无法访问错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:25 27 4
gpt4 key购买 nike

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

{NSLocalizedDescription=Server is unreachable. Check your network connection and try again., NSUnderlyingError=0x174c4c300 "The operation couldnât be completed. (NSURLErrorDomain error -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。

提前致谢,泽

最佳答案

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

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

在您的特定情况下,-1001 错误似乎是 indicating a network timeout .主机查找成功,但由于某种原因,网络请求没有到达服务器。在这种情况下,重试是有意义的。

关于ios - NSURLSession 的服务器无法访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27566385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com