【问题标题】:How to use iOS Reachability如何使用 iOS 可达性
【发布时间】:2012-06-24 11:29:26
【问题描述】:

我正在开发一个使用网络的 iPhone 应用程序。 iPhone 通过 HTTP 请求与我的服务器通信,应该可以在 WiFi 和 3G 上运行。
我目前使用NSURLConnection initWithRequest 向我的服务器发送异步请求并获得响应(但我很快就会开始使用ASIHTTPRequest 库)

我明白,对于这类应用程序(需要互联网连接的应用程序),我应该(必须?)使用可达性。

在网上搜索并查看 Apple 的可达性示例代码后,我仍然不明白一些基本的东西:

可达性的主要目的是什么?

在 Apple 的示例中,它们检测主机、WiFi 和 3G 的网络问题,并向用户显示适当的消息。
这是可达性的主要目的,向用户显示消息吗? 还是我需要将它用于其他更实际的场景?例如,如果NSURLConnaction 请求失败,我是否需要以某种方式使用可达性来重新发送请求?

Reachability 的正确用法是什么?

应用启动时只使用一个实例,然后监听网络变化是否常见?或者我应该在每次网络请求之前检查自己的可达性状态吗?
使用reachabilityWithHostName 是否足够,或者我还需要reachabilityForLocalWiFireachabilityForInternetConnection

还有一件事,我知道苹果可以拒绝使用网络但不使用 Reachability 的应用程序。
我应该实施哪些“必须”方法?
只通知用户当前没有互联网就足够了吗?

【问题讨论】:

    标签: iphone objective-c ios nsurlconnection reachability


    【解决方案1】:

    Reachability 是一个网络助手实用程序类,用于获取有关连接状态的各种信息

    可达性的主要目的是什么?

    Reachability 用于查询网络状态,并注册您的侦听器以便在连接发生变化时获得通知。

    这是 Reachability 的主要目的,向用户显示消息吗?

    不,它的主要用途是测试是否有互联网连接,或者在连接发生变化时得到通知

    例如,如果NSURLConnection 请求失败,我是否需要使用 以某种方式重新发送请求的可达性?

    是的,你可以使用它。例如,我通常在我的项目中所做的是将所有已发出的请求保存到远程服务器。

    假设我要下载 10 个文件。当任何文件由于没有 Internet 连接而导致下载过程失败时,我会将它们保存到一个失败的下载数组中。

    然后,当 Reachability 通知我 Internet 连接已恢复时,我遍历此数组并再次开始下载过程。

    Reachability 的正确用法是什么?

    这取决于您的模式和需求。

    应用启动时只使用一个实例,然后监听是否很常见 网络变化?

    是的,我就是这样做的。在我的项目中,我只有一个下载管理器类的实例,而这个类有唯一一个活动的可达性实例。

    或者我应该在每个网络之前检查自己的可达性状态 请求?

    您可以在没有多个 Reachability 类实例的情况下做到这一点。我通常做的是在我的下载管理器中有一个方法,告诉我是否有连接使用可达性。

    reachabilityWithHostName够用还是我也需要 reachabilityForLocalWiFireachabilityForInternetConnection?

    我不确定这个,但我通常做的是通过所有方式测试连接性。我不区分 3G 或 WiFi,但在某些实现中,此信息(WiFi 或 3G)可能有用。

    【讨论】:

    • 感谢您的回复,您能否检查一下我添加到问题中的“另一件事”
    • 我完全不知道,我在 appstore 上有 5 个以上的应用程序,它们都使用可达性,我在上面的答案中使用了可达性,所以我不知道必须实现什么,我通常实现我所需要的
    • 您说可达性的主要目的之一是“注册您的侦听器以在连接更改时获得通知”,但它不会每次都给回调(尝试切换路由器并检查)。
    • 一个重要的时刻。您不应该根据可达性制定发送(或不发送)请求的逻辑,因为它可能会给您带来误报和误报结果。所以回答“或者我应该在每次网络请求之前检查自己的可达性状态吗?”:是的,你可以检查它以通知用户预期的结果,但你还是应该尝试发送请求。
    【解决方案2】:

    Reachability 是 Apple 制作的一个示例项目。人们将其用作 SystemConfiguration 框架上的 API。正如您已经看到的,有一些方法可以检查主机是否可访问等。

    我使用 Reachabilty 项目的方式是,我使用类方法创建了一个类,如果我从中请求数据的主机可用,则该类方法返回一个布尔值。如果是,则该方法返回YES,如果不是,则返回NO(显然)。

    现在,在我使用连接的应用程序中,您需要/应该检查是否可以按照 Apple 文档所述启动连接。我有一个简单的if,然后显示一条适当的警报消息,表明请求目前无法完成。

    没有要求如果第一次无法执行请求,您应该自动重试。这样做的主要目的是让您的应用程序远离崩溃,同时给用户一个无法完成的消息。

    我自己不使用通知,但那是因为我对监视是否可以进行连接不感兴趣。这是您必须根据您的应用程序需求来决定的事情。

    您不必强制使用 Reachablitiy 类中的所有方法,使用其中一种就足够了。它记录了不同方法提供的内容以及何时在头文件中使用它们。

    记得包含SystemConfiguration 框架。

    【讨论】:

    • 感谢您的回复,在每次网络请求之前检查主机是否可用,这是否会增加每个请求的开销?
    • 是的,但这应该是最小的。不过,我没有注意到这样做有任何明显的开销。对于您添加的问题,我认为我已经回答了。如果还有什么不清楚的地方,请随时询问:)
    • 所以如果我理解正确,请告诉我,为了得到相同的结果,但有通知,我将保留一些全局布尔值“HostIsAvailable”,当我收到可达性通知时,这个布尔值将被更新,然后在每次网络请求之前,我都会检查它是否是 YES,如果不是,我会向用户显示一条警报消息。
    • 是的,这是一种可能的解决方案。您将您的应用程序委托注册为这些通知的接收者,并在收到其中一个通知时更新变量。然后在您的视图控制器中,您可以这样做MyAppDelegate* myAppDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate] 来访问您的变量。
    【解决方案3】:

    Reachability 可以对 Internet 是否可访问做出最佳猜测。它会告诉您是否可以通过 WiFi 访问,或者您是否只能通过移动数据访问。不能保证它是正确的。如果它说您有 WiFi 连接,则该连接可能会在一秒钟后丢失。确定访问 URL 是否有效的唯一方法是进行访问并查看会发生什么。在某些情况下,当 Reachability 说它不起作用时,访问会起作用,反之亦然。

    以下是我使用 Reachability 的目的:由于没有 Internet 连接而导致下载失败后,我将在 Reachability 检测到更改时开始重试(实际上是几秒钟后;在 Reachability 说 WiFi 恢复后,URL 访问通常会立即失败)。在不允许移动数据的地方下载失败后,检查移动数据是否可用,然后要求用户允许使用移动数据。

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多