11

我已经搜索了这个问题的答案,但它并没有真正得到解决,至少没有达到我可以让它发挥作用的地步。

我最初只是检查互联网可达性,使用:

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

4 回答 4

21

使用此功能检查 wifi 是否打开

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

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

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

(netStatus==ReachableViaWiFi)

如果你关心它是否通过 wifi 和

(netStatus==ReachableViaWWAN)

如果你关心它是否通过 WWAN

于 2010-11-15T16:30:42.763 回答
7

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

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

对于互联网/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
}
于 2012-02-20T08:37:23.447 回答
1

苹果的可达性示例向您展示了如何使用通知,这是一种事件推送模型,应该是高效的,但我发现通知并不总是对我正常工作。有时他们不会开火,有时他们会提供错误的信息。所以我最终用一个 2 秒的重复计时器进行轮询,并使用上面stinkbutt 描述的程序检查 wifi 。这是定时器实现的一个很好的参考

于 2011-09-30T02:06:59.110 回答
0

我不确定这是否是您的问题,但我注意到您调用 startNotifier 时这很重要。在我将 startNotifier 调用移至一些 UI 代码,特别是 applicationDidFinishLaunching 之前,我遇到了类似的问题,即从未收到通知(但“从不”的值较短——我想我没有那么耐心)。

于 2010-12-08T19:41:24.470 回答