首页 文章

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

提问于
浏览
11

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

我最初只是检查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:在几秒钟内工作 . 我也单独尝试了每个“对”,以防两个通知程序同时出现问题,但这没有任何区别 .

所以: what is the appropriate way to determine reachability to either the Internet/WWAN or a local Wifi network (either one, or both)?

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

4 回答

  • 1

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

    - (BOOL)isWifiOn {
        Reachability* wifiReach = [Reachability reachabilityForLocalWiFi];
    
        NetworkStatus netStatus = [wifiReach currentReachabilityStatus];
        return (netStatus==ReachableViaWiFi);
    }
    

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

    (netStatus==ReachableViaWiFi)
    

    如果你关心它是通过wifi和

    (netStatus==ReachableViaWWAN)
    

    如果你关心它在WWAN上面

  • 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
    }
    
  • 21

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

  • 0

    我不确定这是不是你的问题,但我注意到当你调用startNotifier时这很重要 . 我有一个类似的问题,从来没有接收过通知(但是我的想法并不是很好),直到我将startNotifier调用移动到某些UI代码,特别是applicationDidFinishLaunching .

相关问题