2016-07-19 55 views
0

現在我正在嘗試爲我的應用程序構建網絡系統。我希望我的網絡操作能夠在網絡故障後重試自己。這就是蘋果正在談論的這種行爲(Designing for Real-World Networks):在哪些錯誤應該重新啓動網絡任務?

對於在用戶的要求下提出請求:

總是試圖建立連接。不要試圖猜測網絡服務是否可用,也不要緩存該確定。 如果連接失敗,請使用SCNetworkReachability API來幫助診斷故障原因。然後:

  • 如果由於瞬間錯誤導致連接失敗,請嘗試再次進行連接。
  • 如果由於主機不可訪問導致連接失敗,請等待SCNetworkReachability API調用您的註冊回調。當主機再次到達時,您的應用程序應該在沒有用戶干預的情況下自動重試連接嘗試(除非用戶已採取某些操作取消請求,例如關閉瀏覽器窗口或單擊取消按鈕)。

我成功地實現了這個功能,但我有麻煩決定什麼«傳輸錯誤»實際上是。

現在我重試接收NSURLErrorNotConnectedToInternetNSURLErrorNetworkConnectionLostNSURLErrorInternationalRoamingOffNSURLErrorCallIsActiveNSURLErrorDataNotAllowedNSURLErrorTimedOut和HTTP狀態碼爲500 ... 599範圍後的任務,但我不知道如果這些就足夠了。

我會很樂意聽到更多有經驗的開發人員的建議,他們也使用重試行爲。你如何決定什麼時候重試任務,什麼時候不重要?

在此先感謝!

回答

0

NSURLErrorCallIsActive不應該發生在最近的設備上(這是針對在您打電話時無法訪問數據的設備);如果發生這種情況,您可以每5秒重試一次,直到用戶掛斷。

NSURLErrorNotConnectedToInternet,NSURLErrorInternationalRoamingOff,NSURLErrorDataNotAllowed可能需要一些用戶操作。除非你先告訴用戶,否則重試是毫無意義的。

NSURLErrorNetworkConnectionLost,NSURLErrorTimedOut和範圍500-599您可以重試,但不會太頻繁。 「連接丟失」應該更改爲「未連接」,或者應該在重試時工作。考慮到「超時」通常需要很長時間(默認爲60秒),因此只有在後臺操作時才需要重試。 500代碼可能在您的代碼中存在錯誤。或者他們可能是需要重新啓動服務器的事情,所以在慷慨的時間後重試。

+0

在Verizon和Sprint,AFAIK上,即使當前的設備也無法在通話過程中訪問數據(除非您使用的是LTE,並且該單元站點上已啓用VoLTE )。 – dgatwood

3

NSURLErrorNetworkConnectionLost:瞬態錯誤。立即嘗試或稍後再試。

NSURLErrorNotConnectedToInternet:沒有連接時返回。在再次嘗試之前等待可達性改變。

NSURLErrorInternationalRoamingOff:當您處於數據漫遊關閉的非家庭蜂窩連接時返回。在再次嘗試之前等待可達性改變。

NSURLErrorCallIsActive:當用戶正在通話時返回。在再次嘗試之前等待可達性改變。

NSURLErrorDataNotAllowed:僅當您明確表示您的請求不應發生在蜂窩網絡上且用戶未在Wi-Fi上時才返回。在再次嘗試之前等待可達性改變。

NSURLErrorTimedOut:當連接嘗試超時等待來自服務器的初始響應時返回。可能是暫時的網絡錯誤。立即再試一次,但在將網絡視爲關閉並等待可訪問性改變再嘗試之前,將嘗試次數限制爲少量。可能開始可達性檢查並再次嘗試請求並行。

服務器錯誤不可能是暫時的,但也不太可能在重試時更改。您應該如何處理這些問題取決於您的應用程序,但可能涉及存儲數據並在一段時間後再次嘗試,告訴用戶服務器已損壞(如果用戶可能能夠做些什麼),自動發送您的服務器團隊的故障單等

相關問題