【问题标题】:NSURLSession fails when attempting to us assigned IP instead of localhost or home尝试分配 IP 而不是 localhost 或 home 时,NSURLSession 失败
【发布时间】:2015-11-08 00:41:30
【问题描述】:

我有一台在本地运行的服务器(我的 IP 是 192.168.0.98),并且一直在尝试使用一些网络代码来访问它。最初这是通过 AFNetworking 完成的,但我现在使用 NSURLSession 完成了它,如下所示:

NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://192.168.0.98:8080/api"];
NSURLSessionDataTask *task = [session dataTaskWithURL: url
                                    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                        NSLog(@"Error: %@", error);
                                        NSLog(@"Body: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                                    }];
[task resume];

然后我用这 3 个 URL 运行它:

  • http://localhost:8080/api -> 有效。
  • http://127.0.0.1:8080/api -> 有效。
  • http://192.168.0.98:8080/api -> 失败并出现错误:

    Error Domain=NSPOSIXErrorDomain 
    Code=2 "No such file or directory" 
    UserInfo={
        NSErrorFailingURLStringKey=http://192.168.0.98:8080/api,
        NSErrorFailingURLKey=http://192.168.0.98:8080api,
        _kCFStreamErrorCodeKey=2,
        _kCFStreamErrorDomainKey=1
    }
    

其中 192.168.0.98 是分配给这台机器的 IP。如果我从 PAW 或浏览器运行这些 URL,它就可以正常工作。但是从单元测试来看它失败了。

从我的项目的角度来看,我可以使用localhost。所以这不是一个交易破坏者。但我很好奇为什么它不起作用。

有人知道问题可能是什么吗?

【问题讨论】:

  • 猜测是因为无法访问该主机或没有进程在该地址的 8080 端口上侦听
  • 确实;您是否使用telnetnetcat 或命令行中的其他内容对此进行了测试?
  • 我已经使用 REST 客户端对此进行了测试,所有 URL 都可以。 192.168.0.98其实就是这台机器。跟踪路由显示 192.168.0.98、localhost 和 127.0.0.1 的相同路由。只有 AfNetworking 对此有问题。
  • 顺便说一句,自从我安装 El Capitan(昨天)后它就开始失败了
  • 经过更多测试,它只发生在 iOS 9 和 tvOS 9 上,而不是在 iOS 8 模拟器上。

标签: ios networking nsurlsession


【解决方案1】:

tl;dr:使用您的 Bonjour local link 域名而不是您的 IP 地址。

我自己也遇到了这个问题。我正在本地构建一个 API,还不想部署到外部服务器,但我需要从模拟器和设备调用 API。我一开始尝试使用 localhost,但当然这不适用于设备,因为 localhost 将是设备本身,而不是我的 Mac。 IP 地址适用于设备,但在模拟器中不起作用。然后我记得我可以为我的 Mac 使用.local 域名来实现其他网络可寻址性,果然它可以工作。我可以在模拟器和测试设备上使用http://mymac.local/ 作为 API 请求的基本 URL。

我不确定为什么使用实际 IP 地址不起作用,但这可能会为您提供一个适合您需求的选项。

【讨论】:

  • sudo scutil --get LocalHostName 将提供您在 url 中使用的本地名称:http://localHostName.local/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多