36

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

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

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

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

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

什么是可达性的正确使用?

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

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

4

3 回答 3

48

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

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

可达性用于查询网络状态,并注册您的侦听器以在连接更改时获得通知。

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

不,它的主要用途是测试是否有 Internet 连接,或者在连接更改时收到通知

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

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

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

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

什么是可达性的正确使用?

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

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

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

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

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

它足够使用reachabilityWithHostName还是我还需要 reachabilityForLocalWiFiand reachabilityForInternetConnection

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

于 2012-06-24T11:43:02.817 回答
12

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

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

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

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

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

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

记得包含SystemConfiguration框架。

于 2012-06-24T11:43:50.450 回答
0

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

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

于 2015-05-24T19:04:08.920 回答