在iOS上是否有与互联网断开连接的事件?

时间:2013-08-13 12:34:54

标签: ios objective-c networking

我的应用程序需要为我使用的某个库(XIMSS for Communigate)提供Internet连接。它从服务器接收状态更新,我无法更改lib的源。有没有办法检测设备是否与互联网断开连接?我想避免每隔x秒ping一次服务器,看看是否还有连接。

4 个答案:

答案 0 :(得分:8)

Apple的Reachability为您做到这一点。通知您连接更改。

答案 1 :(得分:3)

在iOS中,你可以这样检查: -

-(BOOL)returnInternetConnectionStatus{

     ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
     NetworkStatus internetStatus = [reach currentReachabilityStatus];
     if ((internetStatus != NotReachable)) {
           return TRUE;
     } else {
           return FALSE;
     }
}

有关详细信息,请从此处Reachability Sample Code

下载

希望这能帮到你!

答案 2 :(得分:3)

请注意,所有指向Reachability的指针都是一个良好的开端,您肯定需要Reachability,但对于消息传递应用程序来说,这通常是不够的。可达性永远不会发送数据包。它只是告诉你设备是否甚至可以尝试发送数据包,如果你要求它。所以它基本上告诉你,你有一个IP地址,并知道一个网关。它并没有告诉您可以访问您关心的服务器,它绝对不会告诉您该服务器是否可以与您联系(这对于消息传递应用程序来说是一个非常重要的问题)。

在大多数情况下,如果可达性足够,则不需要可达性。 Apple强烈建议(并且有充分理由)在发送数据包之前不检查Reachability。只需发送数据包并处理错误(如果有)。但这对于必须随机接收数据的应用程序没有帮助。

如果连接性较差(特别是由于细胞覆盖率较差),或者您与服务器之间存在防火墙,即使您不再从服务器获取消息,也可以轻松获得可达性的正面结果。检测这种情况的唯一方法是发送数据包并接收数据包(即“ping”)。

当您的连接发生变化时,可达性也不足以引起注意。例如,如果你改变IP地址(当你在城里开车时很常见),可达性并不会总是告诉你(如果你使用SCNetworkReachabilityCreateWithAddressPair()可能会这样;因为我已经解决了这个问题已经有一段时间了;但是Reachability示例代码在任何情况下都不会以这种方式工作。)

所以Reachability是一个很好的第一次开始,但是如果你想检测到服务器不再与你交谈,那么在一天结束时你还需要心跳。要记住的关键是,在IP中,没有“连接”这样的东西。只有数据包。您可以发送它们,然后您就可以收到它们。但如果你没有收到它们,就没有办法区分“没有人发送它们”和“它们没有到达”。只有在交换数据包时才会出现TCP提供的“连接”。

(顺便说一句,在消息应用程序中处理网络连接可能是我用过的最难的iOS代码。测试是一场噩梦。我曾经把手机放在冰箱里以切断其网络访问。至少现在有网络调节器...)

答案 3 :(得分:0)

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReachablilityChange:) name:kReachabilityChangedNotification object:nil];

为可达性更改通知添加通知程序。这将在网络发生更改时调用reachabilityChange,在ReachablilityChange函数检测中

 NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];

在hostStatus中获取状态

    if(hostStatus == NotReachable)

{在这里做你的代码;}