无法使用 Reachability reachabilityForInternetConnection 检测 Internet 连接

Posted

技术标签:

【中文标题】无法使用 Reachability reachabilityForInternetConnection 检测 Internet 连接【英文标题】:can not detect internet connection with Reachability reachabilityForInternetConnection 【发布时间】:2012-03-07 07:56:26 【问题描述】:

我有问题。我正在使用 Reachability 的reachabilityForInternetConnection 方法来检测互联网可用性,但我得到的是连接状态而不是互联网状态。我的意思是,如果我关闭我的 Wifi 连接,该方法会给我正确的指示,表明我没有连接,但如果 wifi 已打开且互联网连接不起作用,它似乎不起作用。有什么想法吗?

最好的问候

【问题讨论】:

我也遇到了这种问题,我想知道为什么人们通常不解决这个问题而只使用可达性。我的意思是如果应用程序连接到 wifi 并且互联网实际上无法正常工作,会发生什么情况。以及他们如何处理这个案子 【参考方案1】:

Reachability 只能用于检测 iPhone 是否连接到互联网网关。网关后面是什么,它不会告诉你。如果 LAN 可以访问但您没有 Internet 出口怎么办? iPhone 怎么会猜到它所看到的(局域网)不是整个互联网?

你应该向一个真实的网站提出一些真实的请求。如果失败,则表示连接到 Internet 存在问题,通过可达性的结果,您甚至可以了解问题出在哪里。最简单的方法是使用 NSUrlRequest 向例如http://www.google.com 发出请求。 (如果 google 死了,您可能会认为存在比您的应用程序连接更大的问题 :)

【讨论】:

如果我的应用被全世界数百万人使用怎么办?我应该从我的应用程序向谷歌或苹果发送大量(如果有数千名用户同时使用我的应用程序)这些网络状态检查请求吗?这样做可以吗? 这取决于您必须多久检查一次应用的可达性 - 尽量减少检查次数。否则我猜是的,没关系 - 每分钟都有 十亿 人在查询google.com.... @Aqueel - 大概你有一个实际的要求?你应该做到。只有这样才能知道它是否会起作用。如果您要发出的实际请求是 foobar.org/users?1213321321312&images=med ,那么知道 google 是否可以访问有什么意义? @hooleyhoop 一般来说你是对的,但是查询像google.com这样高度可靠的服务器可以告诉你你的设备是否连接到互联网的信息。如果您查询 foobar.org 并且失败,则可能是您的设备无法连接到 Internet,而且只有 foobar.org 已关闭,因此使用 google.com 您可以获得更清晰的画面。作为第三步,您还可以尝试 foobar.org 以查看服务器是否已启动。【参考方案2】:

我在我的应用程序中使用它:

// Check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

internetReachable = [Reachability reachabilityForInternetConnection];
[internetReachable startNotifier];

// Check if a pathway to a random host exists
hostReachable = [Reachability reachabilityWithHostName: @"www.apple.com"];
[hostReachable startNotifier];

和:

- (void) checkNetworkStatus:(NSNotification *)notice

    // Called after network status changes
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    
            // Case: No internet
        case NotReachable:
        
            internetActive = NO;

            // Switch to the NoConnection page
            NoConnectionViewController *notConnected = [[NoConnectionViewController alloc] initWithNibName:@"NoConnectionViewController" bundle:[NSBundle mainBundle]];

            notConnected.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
            [self presentModalViewController:notConnected animated:NO];

            break;
        
        case ReachableViaWiFi:
        
            internetActive = YES;
            break;
        
        case ReachableViaWWAN:
        
            internetActive = YES;
            break;
        
    

    // Check if the host site is online
    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)
    
        case NotReachable:
        
            hostActive = NO;
            break;
        
        case ReachableViaWiFi:
        
            hostActive = YES;
            break;
        
        case ReachableViaWWAN:
        
            hostActive = YES;
            break;
        
    

【讨论】:

如果我的应用被全世界数百万人使用怎么办?我应该从我的应用程序向谷歌或苹果发送大量(如果有数千名用户同时使用我的应用程序)这些网络状态检查请求吗?这样做可以吗?

以上是关于无法使用 Reachability reachabilityForInternetConnection 检测 Internet 连接的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking Reachability 首次无法识别互联网连接

NetworkReachabilityManager 或 Reachability 无法识别在没有互联网的情况下连接 wifi

Reachability App 2.2 - 本地 Wifi 无法恢复

使用Reachability实时监测网络连通性

可达性解析主机名但无法ping通主机名

网络状态监測之 Reachability的使用