2012-09-19 24 views
9

我看到很多Reachability示例,其中人员只在可达性状态更改时才显示消息。
但最近,我在Foursquare应用程序中看到,每当用户尝试进行需要Internet连接的操作时,它们都会显示一条消息。
我认为这是更强大和更好的用户体验提醒用户,他不能做任何事情,没有互联网。主要是因为用户可以在应用之间切换,做别的事情,忘记他回来时没有任何联系。
此外,只要他们获得连接,我可以看到他们从互联网获取数据并刷新UI。我应该在每个UIViewController中侦听可达性更新吗?

我真正想要的是做到这一点的最佳方式。这是如何完成的?
他们是否有一个通用的UIViewController,每次需要连接时都会检查可达性?
或者他们有每种互联网请求之前有一种代理类,取消请求并显示一条消息? 你们是如何处理这个问题的?

谢谢。

编辑:

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

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

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

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

回答

15

在今年的WWDC演讲中,苹果舞台上的工程师建议用户不要在应用程序互联网访问基础上实现可达性示例应用程序状态。通常可达性不提供完整的信息(这是基于一个复杂的机制),以及由工程师提供的建议是这样的:

  1. 尝试做你的互联网连接,不管它是可达性状态;然后根据成功/失败结果设置您的用户界面提示
  2. 如果由于网络问题而失败,则注册为可达性并在可达性显示绿灯时重试;当您想要从失败条件中自动恢复时,需要这种设置,无论如何,无论是否可达性状态,都要给予用户“强制重试”的可能性。如果成功,请立即重置您的UI提示。

苹果工程师说的是完全正确的:在互联网连接完好的情况下,您经常可以在控制台日志中看到可达性故障消息。

其他事情:没有比状态栏中显示的网络提示更好的“网络提示”:如果您有Wi-Fi图标,3G/4G图标和手机场强。

回到原来的问题:没有绝对的更好的方法来管理这些东西,这在很大程度上取决于应用程序体系结构。如果你更喜欢把你的网络资源集中到一个专用类(不是UIViewController,而是一个NSObject子类),那么定义该类的只读属性是有意义的,该类在最新的Internet连接之后用“成功/失败”更新与服务器应用程序(它是没有道理的ping其他服务器,如谷歌或苹果:首先它不是优雅的,其次问题可能来自服务器的服务器,而不是设备的互联网连接状态!)。

@property (readonly) BOOL lastConnectionToMyServerSuccess
然后,您的视图控制器可以通过显示图标或其他(我再说一遍:让用户尝试手动尝试连接到互联网)来注册(通过KVO或通过中央通知)更改并更新其UI。视图控制器应在不可见(“viewWillDisappear:”)或卸载(“viewDidLoad:”)或解除分配时从KVO注销。

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

+0

非常感谢这个答案,你还记得它是哪个WWDC谈话/视频吗? – florian

+0

不确定要记住它。尝试会话706和225(会话的第二部分)。 – viggio24

相关问题