iOS上是否有与internet断开连接的事件?

iOS上是否有与internet断开连接的事件?,ios,objective-c,networking,Ios,Objective C,Networking,我有一个应用程序需要我使用的某个库的internet连接(用于Communigate的XIMSS)。它从服务器接收状态更新,我无法更改库的源。是否有办法检测设备是否已断开与internet的连接?我希望避免每隔x秒ping一次服务器以查看是否仍有连接。苹果公司会为您这样做。当连接更改时通知您。在iOS中,您可以这样检查:- -(BOOL)returnInternetConnectionStatus{ ReachabilityLattest *reach = [Reachability

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

苹果公司会为您这样做。当连接更改时通知您。

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

-(BOOL)returnInternetConnectionStatus{

     ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
     NetworkStatus internetStatus = [reach currentReachabilityStatus];
     if ((internetStatus != NotReachable)) {
           return TRUE;
     } else {
           return FALSE;
     }
}
有关更多详细信息,请从此处下载

希望这对你有帮助

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReachablilityChange:) name:kReachabilityChangedNotification object:nil];
为可达性更改通知添加通知程序。这将在网络更改发生时在reachabilityChange函数detect中调用可达性更改

 NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
获取主机状态中的状态

    if(hostStatus == NotReachable)

{在这里编写代码;}

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

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

如果连接性差(特别是由于手机覆盖率差),或者您与服务器之间存在防火墙,那么即使您不再从服务器接收消息,您也可以很容易地从可达性中获得积极的结果。检测这种情况的唯一方法是发送数据包并接收数据包(即“ping”)

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

因此,可达性是一个很好的开始,但在一天结束时,如果您想检测到服务器不再与您通信,您仍然需要心跳。要记住的关键是,在IP中,没有“连接”这样的东西,只有数据包。你可以发送它们,也可以接收它们。但是,如果你没有收到它们,就无法区分“没有人发送”和“他们没有到达”。TCP提供的“连接”错觉只在交换数据包时存在


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

在谷歌上快速搜索可达性,它可能会帮助你。),有很多方法可以实现Ethanks,你知道这是否符合要求吗?即使ping只有几个字节,我的应用程序也将全天候运行,一些用户将使用3g,所以我希望流量尽可能少。@Kevin可能一开始是这样,但如果你是这么问的话,它不是轮询。它使用SystemConfiguration.framework来检测更改。当网络连接发生变化时,你会收到通知。两年后的现在,我不得不说可达性是一堆狗屎。真糟糕,谢谢你提供的信息。我正在使用的库有它自己的超时函数和适当的回调,我可以重写它,所以在我的例子中,可达性是好的。我唯一的问题是lib的超时时间是30秒,我想早点通知用户,因为这涉及到实时存在。在任何情况下+1表示清楚的解释。