NSURLSession 通过 httpproxy 和 /etc/hosts 时出现 -1001 错误
Posted
技术标签:
【中文标题】NSURLSession 通过 httpproxy 和 /etc/hosts 时出现 -1001 错误【英文标题】:-1001 error when NSURLSession via httpproxy and /etc/hosts 【发布时间】:2014-08-13 05:19:09 【问题描述】:我正在尝试在我的计算机中设置一个 http 代理服务器来模拟虚拟开发环境。
为了访问本地 url,我将 DNS 信息放入计算机的/etc/hosts
。
这是我的测试代码:
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://someurl.local/bluh/bluh/path"];
NSURLSessionDataTask *dataTask =
[session dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response,
NSError *error)
NSLog(@"data is %@ error is %@", data, error);
];
[dataTask resume];
我的实验:
1. safari 或 chrome 等浏览器既可以访问本地 Web 服务,也可以访问远程 Web 服务。
2. NSURLSession 在访问本地 url 时会返回一个NSURLErrorDomain Code=-1001 "The request timed out."
。
3. 如果 url 不在/etc/hosts
中,NSURLSession 可以正常工作。
我还尝试了NSURLConnection
,与NSURLSession
的输出相同。
那么,这是否意味着NSURLConnection
/NSURLSession
和浏览器使用不同的策略来做DNS?
如何处理或绕过这个?
更新
我为 ios 7.0+ 构建了这个环境。
环境:
计算机系统:OS X 10.9.4 (13E28)
,其中设置了代理并有服务器。
设备系统:iOS 7.1.2(11D257)
【问题讨论】:
您可能希望更清楚地说明您在何处运行此代码。这是为 OS X 构建的吗?你在你的 iPhone 上运行它吗? (上面的代码可以编译为...)我们可以看到您的主机条目吗?您是否尝试过使用不同的域名?.local
对 OS X 有特定的含义,我相信。我使用<whatever>.localhost
,这种东西对我来说很好。
@MattGibson 在将.local
替换为.localhost
后解决了这个问题。那你介意正式回答一下吗?
真的很幸运没有屏蔽***域...
完成。是的,如果没有真正的 TLD,那将更加困难。
【参考方案1】:
.local
在 OS X 上被视为一个特殊的 TLD,我认为是 iOS。我相信这主要是因为它使用了as an indicator for Bonjour lookups。尝试为您的开发域更改为不同的 TLD。我使用“.localhost”;我见过其他人使用“.dev”。这两个都按预期工作。
从链接的文章中可以看出,您可能遇到了这个问题,具体是因为您使用的是 x.local
——一个单一标签,将通过 Bonjour 而不是 DNS 进行查找,因此您可能还会发现 @ 987654324@ 也可以使用,但我个人会尽量避免使用.local
。
【讨论】:
我们的情况完全相同:运行在本地 Mac 上的服务器可以通过其foo.local
地址访问同一网络上的相邻 Mac 和同一网络上的 Mobile Safari。但是尝试从手机上运行的NSURLSession
连接到foo.local
会导致超时。这个答案并没有告诉我太多——为什么它不起作用?由 Bonjour 或 DNS 进行查找的事实对NSURLSession
应该是透明的,不是吗?以上是关于NSURLSession 通过 httpproxy 和 /etc/hosts 时出现 -1001 错误的主要内容,如果未能解决你的问题,请参考以下文章
通过 NSURLSession / NSURLSessionDownloadTask 下载完成时发送本地通知
通过 React Native 使用 must-revalidate 和 NSURLSession