9

我看到很多可达性示例,其中人们只在可达性状态更改时显示一条消息。
但最近,我在 Foursquare 应用程序中看到,每当用户尝试执行需要 Internet 连接的操作时,它们都会显示一条消息。
我认为这是更强大和更好的用户体验,可以提醒用户他不能在没有互联网的情况下做任何事情。主要是因为用户可以在应用程序之间切换,做其他事情,而当他回来时忘记他没有连接。
同样,只要他们恢复连接,我就可以看到他们从 Internet 获取数据并刷新 UI。

我真正在寻找的是做到这一点的最佳方法。这是怎么做到的?
他们是否有一个通用的 UIViewController 可以在每次需要连接时检查可达性?
或者他们在每个 Internet 请求之前都有一种代理类来取消请求并显示一条消息?你们是怎么处理的?

谢谢。

编辑:

我想出的解决方案是使用 AFNetworking,它还在框中提供可达性状态。
基本上我创建了一个 AFHTTPClient 并在其上设置了一个可达性回调块来监听状态变化。AFHTTPClient 对象是应用程序范围的(一种单例)。(实际上,我需要访问 a.com、b.com 的每个主机都有一个 AFHTTPClient ...)。

然后,当我需要执行一个请求时,我创建一个新的 AFHTTPRequestOperation(在我的情况下为 AFJSONRequestOperation),并将它排入我的 AFHTTPClient 对象。在操作的失败块中,我检查是否可以使用networkReachabilityStatusAFHTTPClient 的属性访问主机。如果无法访问,我会显示一条消息,指出用户没有互联网连接。

我把它包起来了,所以我不必每次创建操作时都这样做。所以现在在应用程序中,每次用户在没有连接的情况下尝试做某事时,他都会收到一条消息,提醒他他无法访问互联网。
一旦我恢复连接(或者更确切地说,一旦我应该有一个连接),我也会使用可达性回调在屏幕上重新加载数据。
我不知道这是否是最佳做法,但我认为很高兴知道该应用程序会在新连接可用时立即重新加载重要数据。

如果有人对示例代码感兴趣,我可以提供。

4

1 回答 1

18

在今年的 WWDC 演讲中,舞台上的 Apple 工程师建议用户不要将应用程序的 Internet 访问建立在 Reachability 示例应用程序状态的基础上。可达性通常不能提供完整的信息(它基于复杂的机制),工程师提供的建议是这样的:

  1. 尝试进行互联网连接,无论可达性状态如何;然后根据成功/失败结果设置您的 UI 提示
  2. 如果由于网络问题而失败,则注册到 Reachability 并在 Reachability 亮绿灯时重试;当您想从失败条件中自动恢复时,这是需要的
  3. 无论如何,无论可达性状态如何,都可以让用户“强制重试”。如果成功,请立即重置您的 UI 提示。

Apple 工程师所说的完全正确:当互联网连接完全正常时,您经常可以在控制台日志中看到可达性失败消息。

另一件事:没有比状态栏中显示的更好的“网络提示”了:如果那里有 wi-fi 图标、3G/4G 图标、蜂窝场强。

回到你原来的问题:没有绝对更好的方法来管理这些东西,这在很大程度上取决于应用程序架构。如果您希望将网络内容集中在一个专用类(不是 UIViewController 而是 NSObject 子类)中,那么为该类定义一个只读属性是有意义的,该属性在最新的互联网连接后更新为“成功/失败”使用服务器应用程序(ping 其他服务器(如 Google 或 Apple)是没有意义的:首先它并不优雅,其次问题可能来自为应用程序提供服务的服务器,而不是设备的互联网连接状态!)。

@property (readonly) BOOL lastConnectionToMyServerSuccess
然后,您的视图控制器可以注册(通过 KVO 或通过中央通知)此属性更改并通过显示图标或其他方式相应地更新其 UI(我重复一遍:让用户可以手动尝试连接到 Internet)。视图控制器应在看不见时(“viewWillDisappear:”)或卸载(“viewDidLoad:”)或释放时从 KVO 注销。

当然,这增加了一些额外的复杂性。例如:您使用该应用程序,互联网指示灯为绿色。然后你暂停它,做其他事情,几分钟后你回到应用程序。在这种情况下,应用程序应该 ping 您的服务器以再次恢复互联网灯状态,因为几分钟后网络状况可能会发生变化(例如,您在火车上)。在任何情况下,所有加载的视图控制器都会从网络专用类获得 KVO 通知并更新自己。

于 2012-09-19T08:17:55.790 回答