当连接Wi-Fi但没有互联网时,可达性无法使用

11

我正在使用苹果的可达性代码,并在网络可达性发生变化时设置初始通知和在启动服务器连接之前进行通知设置。当我使用 Wi-Fi 并关闭 Wi-Fi 接入点时,该代码可以运行。但是,当我在 Wi-Fi 上启动应用程序并且基础宽带连接正常工作,然后在应用程序运行时断开 Wi-Fi 路由器与宽带路由器之间的连接(即 Wi-Fi 是打开状态但不存在互联网连接),并进行可达性检查时,我获取到的网络状态是“通过 Wi-Fi 可达”。我已经尝试了 reachabilityForInternetConnection 和 reachabilityWithHostName 两种方法。

你有没有任何想法,是否能使用苹果的可达性代码来检测 Wi-Fi 连接存在但没有底层网络连接的情况?

谢谢!

2个回答

5

好的,我找到了答案——苹果的可达性并不测试与主机的实际连接。请参阅下面SO链接中@Zhami的答案:

如何在Cocoa/Objective-C中编写一个简单的Ping方法

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

}

只有在检查互联网是否可用时,它才能正常工作。如何监听并在互联网断开连接时立即自动显示不可用状态? - Nandhakumar Kittusamy

1
这是一篇很老的文章,但可以作为参考保留在这里。在可达性示例类中,您可以找到以下代码:
- (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在网络变化时保持更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接