如何检测wifi资源丢失连接时的互联网可达性丢失?

我正在努力获得真正的互联网连接状态。 我已经使用苹果的可达性,但它只是给我的WiFi连接的状态,即不包括当设备通过WiFi连接(路由器或热点),但无线路由器或热点本身没有连接到互联网的情况下。 从wifi路由器拉互联网input电缆可以重复这种情况。 可达性的通告程序为reachabilityForInternetConnectionReachabilityWithHostName返回ReachableViaWiFi 。 我很解决这个问题。 我也通过NSURLConnection尝试过,但这太NSURLConnection了,我个人不喜欢这种解决scheme,不断地在后台线程中发出URL请求。

这里是我使用的代码(礼貌的SO伙伴,不记得确切的链接,虽然)

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; internetReachable = [[Reachability reachabilityForInternetConnection] retain]; [internetReachable startNotifier]; // check if a pathway to a random host exists hostReachable = [[Reachability reachabilityWithHostName: @"www.google.com"] retain]; [hostReachable startNotifier]; 

那么在观察者的方法中:

  - (void) checkNetworkStatus:(NSNotification *)notice{ // called after network status changes NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; switch (internetStatus) { case NotReachable: { NSLog(@"The internet is down."); self.isInternetReachable = NO; break; } case ReachableViaWiFi: { NSLog(@"The internet is working via WIFI."); self.isInternetReachable = YES; break; } case ReachableViaWWAN: { NSLog(@"The internet is working via WWAN."); self.isInternetReachable = YES; break; } } NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; switch (hostStatus) { case NotReachable: { NSLog(@"A gateway to the host server is down."); self.isHostReachable = NO; break; } case ReachableViaWiFi: { NSLog(@"A gateway to the host server is working via WIFI."); self.isHostReachable = YES; break; } case ReachableViaWWAN: { NSLog(@"A gateway to the host server is working via WWAN."); self.isHostReachable = YES; break; } } } 

根据可达性,它不仅检查wifi,而且还检查WWAN / 3G和没有互联网接入,为什么你认为它不检查除WIFI以外?

  typedef enum { NotReachable = 0, ReachableViaWiFi, ReachableViaWWAN } NetworkStatus; 

如果你想检查一个特定主机的可达性,那么你可以像这样设置主机

 Reachability *hostReach = [Reachability reachabilityWithHostName: @"www.google.com"]; NetworkStatus netStatus = [hostReach currentReachabilityStatus]; switch (netStatus) { case ReachableViaWWAN: { NSLog(@"WWAN/3G"); break; } case ReachableViaWiFi: { NSLog(@"WIFI"); break; } case NotReachable: { NSLog(@"NO Internet"); break; } } 

见约旦的答复。 苹果官方Reachability.m中有一个愚蠢的错误。 returnValue的types应该是“NetworkStatus”而不是“BOOL”:

 - (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags { ... NetworkStatus returnValue = NotReachable; ... } 

否则,你将面临以下可怕的后果:

  1. 即使蜂窝连接可用,它也将被报告为不可用。
  2. 如果Wifi不可用,则在蜂窝连接可用的情况下,Wifi将被报告为可用。

不能相信苹果从来没有打扰到解决这个问题。

(PS新的堆栈溢出,没有代表upvote乔丹)

即使断开连接,我也获得了Wifi标志。 Reachability.m方法中有一个错误:

 - (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags 

它使用一个BOOL作为返回值,但是它赋值给一个结构值为3的值:

 typedef enum : NSInteger { NotReachable = 0, ReachableViaWiFi, ReachableViaWWAN } NetworkStatus; 

所以,如果Wifi或者Cellular是否可用,它将ReachableViaWiFi(作为一个布尔可以是0或1,但不是两个)

要解决这个问题,只需在上面的方法中进行更改:

 BOOL returnValue = NotReachable; 

为了这:

 int returnValue = NotReachable; 

你很好走。 希望能帮助到你。