当无线连接但没有互联网时,可达性不工作

我正在使用Apple的可达性代码,并且在启动服务器连接之前设置了networking可达性更改时的初始通知。 当我使用wi-fi时,该代码正常工作,并closureswi-fi接入点。 但是,当我启动应用程序与Wi-Fi和底层的宽带连接工作,然后一旦应用程序正在运行,然后从宽带路由器断开Wi-Fi路由器(即Wi-Fi已经打开,但没有互联网连接),我做了可达性检查,我得到的networking状态是ReachableViaWiFi。 我已经尝试了reachabilityForInternetConnection和reachabilityWithHostName。

任何想法,如果苹果的可达性代码可以用来检测的情况下,无线连接,但没有底层networking连接?

谢谢!

好吧,我find了答案 – 苹果的可达性并没有testing到主机的实际连接。 在下面的链接中查看@Zhami的答案:

如何在Cocoa / Objective-C中编写一个简单的Ping方法

从本质上讲,当你第一次启动应用程序,并进行可达性检查,iOS似乎做一个DNS查找,如果没有互联网,检查失败。 所以第一次检查可达性时,它实际上会返回一个有意义的值。 但是,如果您是在应用程序启动时连接的,并且在一段时间后仍然失去互联网连接(虽然仍然连接到WiFi / 3G / 4G,但是没有基础的互联网连接),但即使互联网或指定的主机不可达,进一步的可达性检查仍然可以返回了。

所以如果你想真正地检查连通性,请考虑使用以下内容:

-(BOOL) isConnected { NSString* url = [NSURL URLWithString:@"http://www.google.com/m"]; ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; [request setTimeOutSeconds:10]; //customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long [request setNumberOfTimesToRetryOnTimeout:0]; [request startSynchronous]; NSError *error = [request error]; if (error) { DLog(@"connectivity error"); return NO; } else { DLog(@"connectivity OK"); return YES; } } 

这是一个很老的post,但可以留在这里作为参考。 在可达示例类中,您可以find以下代码:

 - (BOOL)startNotifier { BOOL returnValue = NO; SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) { if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) { returnValue = YES; } } return returnValue; } 

这将使您的_reachabilityRef更新到networking更改。