使用Reachability for Internet *或*本地WiFi?

时间:2010-04-15 18:11:07

标签: iphone cocoa networking reachability

我搜索过这个问题的答案,并没有真正解决,至少在某些方面我无法解决这个问题。

我最初只是使用以下方法检查Internet可达性:

self.wwanReach = [Reachability reachabilityWithHostName:@"www.apple.com"];
[wwanReach startNotifer];

我现在需要支持本地WiFi连接(一般情况下没有上网),当我找到+reachabilityForLocalWiFi时,我也注意到+reachabilityForInternetConnection。我想我可以使用这些,而不是在那里硬编码"www.apple.com",但唉,当我使用时:

self.wwanReach = [Reachability reachabilityForInternetConnection];
[wwanReach startNotifer];
self.wifiReach = [Reachability reachabilityForLocalWiFi];
[wifiReach startNotifer];

我设置的“可永久”的可达性回调被调用,对于“永不”的值,最多10分钟,12分钟,15分钟左右(只要我耐心持续。)(用户的耐心会很多)更少,我确定。)切换回+ reachabilityWithHostName:在几秒钟内工作。我也单独尝试了每个“对”,以防两个通知同时出现问题,但没有区别。

所以:确定Internet / WWAN或本地Wifi网络(一个或两个)的可达性的适当方法是什么?

[此特定用例是连接到Mac mini计算机到计算机网络的iPhone或iPad;我确定其他情况适用。]

4 个答案:

答案 0 :(得分:21)

使用此功能检查wifi是否亮起

- (BOOL)isWifiOn {
    Reachability* wifiReach = [Reachability reachabilityForLocalWiFi];

    NetworkStatus netStatus = [wifiReach currentReachabilityStatus];
    return (netStatus==ReachableViaWiFi);
}

类似的代码可用于检查reachabilityForInternetConnection,但您必须检查

(netStatus==ReachableViaWiFi)

如果你关心它是通过wifi和

(netStatus==ReachableViaWWAN)

如果你关心它是在WWAN上面

答案 1 :(得分:7)

我遇到了同样的问题。我最终发现,对于WWAN或WiFi可达性,只有在网络发生变化时才会调用通知回调。

换句话说,在创建可访问性对象后立即检查当前的可访问性。不要等待通知,因为只有在下一次网络更改发生时才会发布通知。

对于Internet / WWAN:

self.wwanReach = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [wwanReach currentReachabilityStatus];
if (networkStatus == ReachableViaWWAN) {
    // do something
}

对于WiFi:

self.wifiReach = [Reachability reachabilityForLocalWiFi];
NetworkStatus networkStatus = [wifiReach currentReachabilityStatus];
if (networkStatus == ReachableViaWiFi) {
    // do something
}

答案 2 :(得分:1)

来自apple的可访问性示例向您展示了如何使用通知,这是一个事件推送模型并且应该是高效的,但我发现通知并不总是适合我。有时他们不会开火,有时他们会提供错误的信息。所以我最终使用2秒重复计时器进行轮询,并使用上面described by stinkbutt之类的过程检查wifi。这是一个good reference for timer implementation

答案 3 :(得分:0)

我不确定这是不是你的问题,但我注意到你调用startNotifier时很重要。我有一个类似的问题,从来没有收到通知(但是“从不”的值更短 - 我想我不是那么有用),直到我将startNotifier调用移动到某些UI代码,特别是applicationDidFinishLaunching。