我不时使用 AFNetworking 和 Reachability,但它一直用于检查互联网连接。如何判断 iOS 设备是否连接到没有互联网连接的 WLAN?
我必须能够实时了解可达性状态。
*只是一个澄清:
我不想检查互联网是否可以访问。我想检查设备是否连接到 WLAN。
*将 LAN 更改为 WLAN 以澄清
每个人都使用的标准Reachability
类非常具有欺骗性。它试图确定主机是否只能通过猜测来访问。例如,如果您想知道您当前是否能够访问 www.google.com,并且您调用[Reachability reachabilityWithHostname:@"www.google.com"];
该应用程序从未真正“接触”服务器以确保它已打开、连接或响应。
Reachability 的实际作用大致如下:
您遇到的问题是,如果您使用 WiFi,但用户尚未同意条款和条件,这在星巴克很常见,目的地仍将被报告为可达。
测试网络连接的唯一真正方法是下载一些东西。例如,我经常在专门用于此目的的服务器上看到 Ping/Pong 功能和心跳文件。在这个庄园中,您不仅可以测试您的互联网,还可以测试服务器是否按预期运行。
可达性处理到 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;
}
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;
}