iOS:reachabilityWithHostname YES 虽然它应该是 NO

标签 ios reachability

我测试了不同的框架,例如

我想知道主机是否可达。在我的 iPhone 上,我将 iMac 设置为代理 (Charles) 并阻止或不阻止连接,但可达性始终为 YES。只有当我设置一个不存在的主机时,它才返回 NO。但是如果主机存在但我阻止了与它的连接,我总是得到 isReachable。有没有办法检查主机是否真的可达?

如果我尝试使用 KSReachability,我将执行以下操作:

self.reachability = [KSReachability reachabilityToHost:@"www.stackoverflow.com"];
self.reachability.notificationName = kDefaultNetworkReachabilityChangedNotification;
self.reachability.onReachabilityChanged = ^(KSReachability *reachability) {
    NSLog(@"isReachable: %i", reachability.reachable);
};

我总是得到 isReachable: 1 具有以下配置:

  • 已连接 Wifi
  • 将我的 iMac 配置为 HTTP 代理
  • 在我的 Charles 代理中阻止 www.stackoverflow.com

当我尝试在 Safari 中访问 www.stackoverflow.com 时,页面无法打开(如预期的那样)。在这种情况下,我希望可达性为假 (isReachable: 0)。

编辑 所以对我来说最重要的问题是——如何实现我期望的行为? IE。该应用会持续检查给定主机是否真的可达?

最佳答案

代码声明:

self.reachability = [KSReachability reachabilityToHost:@"www.stackoverflow.com"];

实际调用以下方法:

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                          [hostName UTF8String]);

SCNetworkReachability 引用说:

The SCNetworkReachability programming interface allows an application to determine the status of a system's current network configuration and the reachability of a target host. A remote host is considered reachable when a data packet, sent by an application into the network stack, can leave the local device. Reachability does not guarantee that the data packet will actually be received by the host.

解释清楚,iOS 系统不会向外界发送任何请求来检查可达性。它只是告诉数据包是否可以离开设备。如果系统要发送请求,它会自动表示它已连接到网络。

您可以通过提及像“www.stackoverflow.com”这样的有效主机来验证这一点,并检查 charles(首先取消阻止它)没有发送请求。您还可以检查其他有效的主机名,如“www.abcdefgh。 com”(通过在 Safari 中运行它来验证这一点并在 charles 中查看)它还为您提供了可达性,但 charles 没有显示任何请求。此外,如果您将 http://放在任何有效主机之前,如“http://www.stackoverflow.com”,它也会可达性失败。所以很明显不是传出的http请求。如果系统必须向外部发送请求,那么提供该类的意义何在?开发人员可以创建网络连接并尝试连接到主机并查看它是通过还是失败。

然而,有趣的是,如果提供了一个无效的主机,如“www.hjjkhkhk.com”,iOS 系统会将可达性视为错误。现在的问题是 iOS 系统如何在不向外界发送任何查询的情况下找到有效或无效的主机?可能是定期缓存 DNS 范围列表???对我来说极不可能。

关于iOS:reachabilityWithHostname YES 虽然它应该是 NO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24260833/

相关文章:

iphone - 当应用程序从后台删除或在 iOS 中删除时发生的事件

iphone - "cellForRowAtIndexPath:"中 indexPath.section 的奇怪行为

ios - 可达性和信号强度

ios - 使用 iOS MobileSDK 同步执行 SalesForce SOQL 查询

ios - iOS-将 “objects”添加到现有应用中(越狱)

ios - 检测子层元素上的触摸

ios - 无法在没有参数的情况下调用类型 'Reachability' 的初始值设定项

ios - 计时器? - 检查连接 iOS

ios - 使用 SWIFT 检查 IP 地址可达性

ios - 我应该在每个 UIViewController 中监听可达性更新吗?