0

我不时使用 AFNetworking 和 Reachability,但它一直用于检查互联网连接。如何判断 iOS 设备是否连接到没有互联网连接的 WLAN?

我必须能够实时了解可达性状态。

*只是一个澄清:

我不想检查互联网是否可以访问。我想检查设备是否连接到 WLAN。

*将 LAN 更改为 WLAN 以澄清

4

3 回答 3

1

每个人都使用的标准Reachability类非常具有欺骗性。它试图确定主机是否只能通过猜测来访问。例如,如果您想知道您当前是否能够访问 www.google.com,并且您调用[Reachability reachabilityWithHostname:@"www.google.com"];该应用程序从未真正“接触”服务器以确保它已打开、连接或响应。

Reachability 的实际作用大致如下:

  1. 使用当前 DNS 配置查找 IP 地址。如果 DNS 无法解析,则主机无法访问。
  2. 查看所有已知网络连接的当前状态。如果它们都关闭,则主机无法访问。
  3. 对于每个网络适配器,确定目标 IP 是否在本地子网上。如果是,请将其报告为可达。
  4. 对于每个网络适配器,确定是否存在到目标 IP 的路由路径。通常这只查看默认网关。如果存在到目标 IP 的路径,则将其报告为可达。
  5. 如果一切都失败了,则无法访问主机。

您遇到的问题是,如果您使用 WiFi,但用户尚未同意条款和条件,这在星巴克很常见,目的地仍将被报告为可达。

测试网络连接的唯一真正方法是下载一些东西。例如,我经常在专门用于此目的的服务器上看到 Ping/Pong 功能和心跳文件。在这个庄园中,您不仅可以测试您的互联网,还可以测试服务器是否按预期运行。

于 2013-10-19T20:51:43.223 回答
1

可达性处理到 2 种网络连接的连接,WWans(蜂窝连接)和 WiFi。我猜你说的是通过 WiFi 连接。

尝试这样的事情:

-(BOOL)isWifiRouterConnected
{
    BOOL returnValue = NO;
    //test for a wifi connection
    Reachability *wifiReachability = [Reachability reachabilityForLocalWiFi];
    BOOL wifiReachable = [wifiReachability isReachableViaWiFi];

    //test for connection to google
    if( wifiReachable )
    {
        returnValue = [Reachability reachabilityWithHostname:@"google.com"];
    }
    return returnValue;
 }
于 2013-10-17T16:30:05.977 回答
-1

Take a look at Network Apps for iPhone OS, Part 1 and Part 2.

Do not use Reachability to preflight your connection and just fire your request.

If you insist on using Reachability to test your connection befor you fire a request, use the method described by Jonah and test with your, only internal reachable, hostname.

For example:

    // ... 
    if (wifiReachable) {
        returnValue = [Reachability reachabilityWithHostname:@"internalserver.example.com"];
    }
    return returnValue;
}
于 2013-10-17T20:25:59.127 回答