Using Reachability for Internet *or* local WiFi?

五迷三道 提交于 2019-11-29 09:29:33

Use this function to check if wifi is on

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

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

similar code can be used to check reachabilityForInternetConnection but you have to check

(netStatus==ReachableViaWiFi)

if you care that it's over wifi AND

(netStatus==ReachableViaWWAN)

if you care that it's over WWAN

I ran int the same problem. What I found in the end is that for WWAN or WiFi reachability, the notification callback is only called when there is a network change.

In other words, check the current reachability immediately after you create the reachability object. Do not wait for the notification, because the notification will only be posted when next network change happens.

For Internet/WWAN:

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

For WiFi:

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

The reachability example from apple shows you how to use a notification, which is an event push model and supposed to be efficient, but I found that the notifications weren't always working properly for me. Sometimes they wouldn't fire, other times they would provide wrong information. So I ended up polling with a 2 second repeating timer, and checking for wifi with a procedure like the one described by stinkbutt above. Here's a good reference for timer implementation.

I'm not sure if this is your problem, but I noticed that it matters when you call startNotifier. I was having a similar problem with never receiving notifications (but with shorter values for "never" -- I guess I'm not as paitent) until I moved the startNotifier call into some UI code, specifically applicationDidFinishLaunching.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!