4

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

4

4 回答 4

8

Apple 的可达性为您做到了这一点。在您的连接更改时通知您。

于 2013-08-13T12:39:17.683 回答
3

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

-(BOOL)returnInternetConnectionStatus{

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

有关更多详细信息,您可以从此处下载可达性示例代码

希望这对你有帮助!

于 2013-08-13T12:39:47.800 回答
3

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

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

如果连接性很差(特别是由于小区覆盖范围很差),或者如果您和服务器之间有防火墙,即使您不再从服务器收到消息,您也可以轻松地从 Reachability 获得积极的结果。检测这种情况的唯一方法是发送一个数据包并接收一个数据包(即“ping”)。

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

所以 Reachability 是一个很好的开始,但在一天结束时,如果你想检测到服务器不再与你交谈,你仍然需要一个心跳。要记住的关键是,在 IP 中,没有“连接”之类的东西。只有数据包。您可以发送它们,也可以接收它们。但是,如果您没有收到它们,则无法区分“没有人发送它们”和“它们没有到达”。TCP 给出的“连接”错觉只存在于交换数据包时。

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

于 2013-08-13T13:55:18.947 回答
0
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReachablilityChange:) name:kReachabilityChangedNotification object:nil];

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

 NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];

在 hostStatus 中获取状态

    if(hostStatus == NotReachable)

{在这里做你的代码;}

于 2013-08-13T13:09:13.727 回答