【问题标题】:Reachability not working when wi-fi connected but no internet连接 Wi-Fi 但没有互联网时,可达性不起作用
【发布时间】:2012-11-16 06:32:11
【问题描述】:

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

关于是否可以使用 Apple 的可达性代码来检测 wifi 已连接但没有底层网络连接的情况有什么想法吗?

谢谢!

【问题讨论】:

    标签: objective-c ios networking reachability connectivity


    【解决方案1】:

    好的,我找到了答案 - Apple 的可达性并未测试与主机的实际连接。在下面的 SO 链接中查看@Zhami 的答案:

    How to write a simple Ping method in Cocoa/Objective-C

    基本上,当您第一次启动应用程序并进行可达性检查时,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;
        }
    
    }
    

    【讨论】:

    • 当我检查互联网是否可用时,它会起作用。如何在互联网断开时立即收听并自动显示互联网不可用状态?
    【解决方案2】:

    这是一篇很老的帖子,但可以留在这里供参考。在可达性示例类中,您可以找到以下代码:

    - (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 更新到网络变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多