我的应用程序需要为我使用的某个库(XIMSS for Communigate)提供Internet连接。它从服务器接收状态更新,我无法更改lib的源。有没有办法检测设备是否与互联网断开连接?我想避免每隔x秒ping一次服务器,看看是否还有连接。
答案 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)
{在这里做你的代码;}