iOS:reachabilityWithHostname YES虽然它应该是NO

前端之家收集整理的这篇文章主要介绍了iOS:reachabilityWithHostname YES虽然它应该是NO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我测试了不同的框架,例如

> https://github.com/tonymillion/Reachability
> https://github.com/VerticodeLabs/VCLReachability
> https://github.com/kstenerud/KSReachability

我想知道主机是否可以访问.在我的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-Proxy
>在Charles Proxy中阻止www.stackoverflow.com

当我尝试在Safari中访问www.stackoverflow.com时,无法打开页面(按预期方式).在这种情况下,我希望可达性为false(isReachable:0).

编辑
所以对我来说最重要的问题是 – 如何实现我期待的行为?即应用程序不断检查给定的主机是否真的可以访问?

解决方法

代码声明:
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”这样的有效主机验证这一点,并检查没有请求发送的查尔斯(首先取消阻止它).你也可以查看其他有效的主机名,如“www.abcdefgh.com”(通过在Safari中运行并查看查尔斯来验证这一点)它还为您提供了可访问性,但查尔斯没有显示请求.如果您在任何有效主机之前放置http://,如“http://www.stackoverflow.com”之类,它也将无法实现可访问性.所以很明显它不是传出的http请求.如果系统必须在外面发送请求,那么提供课程的重点是什么?开发人员可以创建网络连接并尝试连接到主机并查看它是通过还是失败.

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

猜你在找的iOS相关文章