【问题标题】:Is there an event for disconnecting from the internet on iOS?iOS上是否有断开互联网连接的事件?
【发布时间】:2013-08-13 12:34:53
【问题描述】:

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

【问题讨论】:

标签: ios objective-c networking


【解决方案1】:

Apple 的 Reachability 会为您执行此操作。在您的连接发生变化时通知您。

【讨论】:

  • 谢谢,你知道这是否有要求吗?即使 ping 只是几个字节,我的应用程序将 24/7 运行,并且一些用户将使用 3g,所以我希望流量尽可能少。
  • @Kevin 最初可能,但不是轮询,如果那是您要问的。它使用 SystemConfiguration.framework 来检测更改。当网络连接发生变化时,您会收到通知。
  • 两年多过去了,我得说可达性是一坨屎。事实上,这太糟糕了,several people have written their own classes with the same purpose.
【解决方案2】:

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

-(BOOL)returnInternetConnectionStatus{

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

更多详情您可以从这里下载Reachability Sample Code

希望对你有帮助!

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您提供的信息。我正在使用的库有它自己的超时函数和适当的回调,我可以覆盖它,所以在我的情况下,可达性很好。我遇到的唯一问题是 lib 的超时时间为 30 秒,我想尽快通知用户,因为涉及实时存在。无论如何+1以获得清晰的解释。
    【解决方案4】:
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReachablilityChange:) name:kReachabilityChangedNotification object:nil];
    

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

     NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    

    在 hostStatus 中获取状态

        if(hostStatus == NotReachable)
    

    {在此处编写您的代码;}

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多