我测试了不同的框架,例如
- https://github.com/tonymillion/Reachability https://github.com/tonymillion/Reachability
- https://github.com/VerticodeLabs/VCLReachability https://github.com/VerticodeLabs/VCLReachability
- https://github.com/kstenerud/KSreachability https://github.com/kstenerud/KSReachability
我想知道是否可以联系到主机。在我的 iPhone 上,我将 iMac 设置为代理 (Charles) 并阻止或不阻止连接,但可达性始终为“是”。仅当我设置一个不存在的主机时,它才会返回 NO。但是如果主机存在但我阻止了与其的连接,我总是会得到isReachable
。有没有办法检查主机是否really可达吗?
如果我尝试使用 KSreachability,我将执行以下操作:
self.reachability = [KSReachability reachabilityToHost:@"www.stackoverflow.com"];
self.reachability.notificationName = kDefaultNetworkReachabilityChangedNotification;
self.reachability.onReachabilityChanged = ^(KSReachability *reachability) {
NSLog(@"isReachable: %i", reachability.reachable);
};
我总是得到isReachable: 1
有以下配置:
- 已连接至 Wi-Fi
- 将我的 iMac 配置为 HTTP 代理
- 在我的 Charles 代理中阻止 www.stackoverflow.com
当我尝试在 Safari 中访问 www.stackoverflow.com 时,该页面无法打开(如预期)。我希望可达性是错误的(isReachable: 0
) 在这种情况下。
EDIT所以对我来说最重要的问题是 - 如何实现我期望的行为? IE。该应用程序不断检查给定的主机是否really可达吗?
代码声明:
self.reachability = [KSReachability reachabilityToHost:@"www.stackoverflow.com"];
实际上调用下面的方法:
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
[hostName UTF8String]);
SCNetworkReachability 参考资料说:
SCNetworkReachability 编程接口允许应用程序
确定系统当前网络配置的状态
以及目标主机的可达性。考虑远程主机
当应用程序将数据包发送到网络时可达
堆栈,可以离开本地设备。不保证可达性
数据包实际上会被主机接收。
解释清楚地表明,iOS 系统不会向外界发送任何请求来检查可达性。它只是告诉数据包是否可以离开设备。如果系统发送请求,则自动意味着它已连接到网络。
您可以通过提及“www.stackoverflow.com”等有效主机来验证这一点,并检查 charles(首先取消阻止它)是否未发送任何请求。您还可以检查其他有效主机名,如“www.abcdefgh.com”(通过在 Safari 中运行它来验证这一点,并在 charles 中查看)它也为您提供了可达性,但 charles 没有显示任何请求。此外,如果您将 http:// 放在任何有效主机之前,例如“http://www.stackoverflow.com http://www.stackoverflow.com“它也会导致可达性失败。因此很明显,这不是一个传出的 http 请求。如果系统必须向外部发送请求,那么提供该类的意义何在?开发人员可以创建一个网络连接并尝试连接到主机并查看它是否通过或失败。
然而有趣的是,如果提供了像“www.hjjkhkhk.com”这样的无效主机,iOS 系统会将可达性视为错误。现在的问题是iOS系统如何在不向外界发送任何查询的情况下找到有效或无效的主机?可能是它定期缓存 DNS 范围列表???对我来说极不可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)