2012-09-19 25 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

相關問題