2015-09-04 57 views
1

我們正在開發一個企業應用程序,用於將用戶輸入的表單數據發送到服務器。應用程序嘗試在用戶點擊保存後立即發送數據。如果發送數據時出現問題(例如無網絡連接),我們希望在X分鐘後再次嘗試,並定期重試,直到數據成功發送。這些請求通常不是非常大或運行時間很長,但用戶經常處於無網絡訪問的環境中,因此重試很重要。在後臺向服務器發送數據/重試請求的選項

在應用程序運行時重試API請求很簡單,但理想情況下,我們希望在應用程序處於後臺時定期重試。 iOS背景執行功能可以實現的最佳效果是什麼?以下是我看到的一些選項:

  • 使用beginBackgroundTaskWithExpirationHandler:進行一次性請求以獲得更多時間。這會給我們一個額外的嘗試,在應用程序轉到後臺後發送數據,但不會重複嘗試
  • 使用「後臺獲取」功能,並嘗試在應用程序被喚醒時向服務器發送任何新數據爲背景獲取。聽起來不錯,但我擔心這可能是濫用背景獲取功能?

是我最好的選擇之一嗎?我錯過了另一種方法嗎?

這是一個iOS和Android實現的Xamarin應用程序,但我不認爲這對我的問題有重大影響;我可以根據需要編寫iOS特定的代碼。

回答

1

我認爲有一種方法,你錯過了:background NSURLSessions。我認爲這是你應該使用的。

我真的不知道你可以有多少杆。這是我推薦的:

  • 當你開始後臺下載時,也開始一個後臺任務(與beginBackgroundTaskWithExpirationHandler:)。
  • 只要您的後臺任務尚未過期,即使在後臺,您也可以重新開始下載。
  • 如果您的後臺任務過期處理程序被調用,您需要立即結束後臺任務。此時,您的應用將停止執行,並且您的下載將在外部進程中繼續。
  • 當下載完成或失敗時,您的應用將在後臺重新啓動,並有機會處理結果。我不知道的是,如果你現在可以開始一個新的後臺下載。你應該嘗試或等待比我知道得更清楚的人...

此外一定要檢查-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes;委託方法,以便重新啓動您的下載失敗而不重新開始。

+0

是的,我應該把它列入選項列表。但是,如果我使用它來再次嘗試上傳數據,並且嘗試失敗,那麼當應用程序仍處於後臺時,是否有任何方法可以嘗試其他請求?或者我基本上只有一個鏡頭,必須等待應用程序返回到前臺才能嘗試第二個請求? –

+0

看到我編輯的答案。 – deadbeef

+0

謝謝,很多很好的細節。我們實際需要做的是將數據發佈到服務器,所以它將成爲後臺上傳任務,但基本思路應該是相同的。如果沒有提供更好的解決方案,我會接受你的回答。 –

相關問題