我有一个应用程序需要我使用的某个库(XIMSS for Communigate)需要互联网连接。它从服务器接收状态更新,我无法更改库的来源。有没有办法检测设备与互联网断开连接?我想避免每 x 秒 ping 一次服务器以查看是否仍有连接。
4 回答
Apple 的可达性为您做到了这一点。在您的连接更改时通知您。
在 iOS 中,您可以这样检查:-
-(BOOL)returnInternetConnectionStatus{
ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
NetworkStatus internetStatus = [reach currentReachabilityStatus];
if ((internetStatus != NotReachable)) {
return TRUE;
} else {
return FALSE;
}
}
有关更多详细信息,您可以从此处下载可达性示例代码
希望这对你有帮助!
请注意,所有指向 Reachability 的指针都是一个好的开始,您肯定需要 Reachability,但对于消息传递应用程序来说,这通常是不够的。可达性从不发送数据包。它只是告诉您设备是否可以在您要求时尝试发送数据包。所以它基本上告诉你你有一个IP地址并且知道一个网关。它不会告诉您可以访问您关心的服务器,也绝对不会告诉您该服务器是否可以访问您(这对于消息传递应用程序来说是一个非常重要的问题)。
在大多数情况下,如果 Reachability 足够,您就不需要 Reachability。Apple 强烈建议(并且有充分的理由)在发送数据包之前不要检查可达性。只需发送数据包并处理错误(如果出现)。但这对于必须随机接收数据的应用程序没有帮助。
如果连接性很差(特别是由于小区覆盖范围很差),或者如果您和服务器之间有防火墙,即使您不再从服务器收到消息,您也可以轻松地从 Reachability 获得积极的结果。检测这种情况的唯一方法是发送一个数据包并接收一个数据包(即“ping”)。
当您的连接发生变化时,可达性也不足以引起注意。例如,如果您更改 IP 地址(当您在城里开车时很常见),Reachability 不会总是告诉您(如果您使用它可能会SCNetworkReachabilityCreateWithAddressPair()
;我已经有一段时间没有解决这个问题了;但是 Reachability 示例代码在任何情况下都不能以这种方式工作)。
所以 Reachability 是一个很好的开始,但在一天结束时,如果你想检测到服务器不再与你交谈,你仍然需要一个心跳。要记住的关键是,在 IP 中,没有“连接”之类的东西。只有数据包。您可以发送它们,也可以接收它们。但是,如果您没有收到它们,则无法区分“没有人发送它们”和“它们没有到达”。TCP 给出的“连接”错觉只存在于交换数据包时。
(顺便说一句,在消息应用程序中处理网络连接可能是我做过的最难的 iOS 代码。测试是一场噩梦。我曾经把手机放在冰箱里以切断其网络访问。至少现在有网络调节器……)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReachablilityChange:) name:kReachabilityChangedNotification object:nil];
为可达性更改通知添加通知程序。这将在网络更改发生时调用可达性更改,在 ReachablilityChange 函数中检测
NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
在 hostStatus 中获取状态
if(hostStatus == NotReachable)
{在这里做你的代码;}