2013-10-04 72 views
18

在閱讀Apple有關使用新的iOS7 api(NS​​URLSession)下載後臺的文檔後,我感到有點失望。我相信,蘋果在管理在後臺網絡可用性暫停/恢復(或提供一個選項,這樣做),但沒有...NSURLSession後臺下載 - 恢復網絡故障

所以閱讀文檔,這是我們已經有了:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

When any task completes, the NSURLSession object calls the delegate’s URLSession:task:didCompleteWithError: method with either an error object, or nil if the task completed successfully. If the task is a resumable download task, the NSError object’s userInfo dictionary contains a value for the NSURLSessionDownloadTaskResumeData key. Your app should use reachability APIs to determine when to retry, and should then call downloadTaskWithResumeData: or downloadTaskWithResumeData:completionHandler: to create a new download task to continue that download. Go to step 3 (creating and resuming task objects).

到目前爲止,我百思不得其解,但我的問題是:什麼建築是最好的處理網絡的損失和恢復在後臺下載?

在我身邊,我使用可達性,每次網絡可用時,我都會恢復所有任務(創建時通過NSArray引用),並在網絡丟失時掛起它們。這種運作良好前景,但爲背景,我需要在以下幾點幫助:

  • 如果我的應用程序在前臺沒有連通,如果我去後臺無法連接我所有的任務仍然暫停,不會回來,如果網絡可用...

  • 在後臺丟失網絡,停止所有我的下載/任務。 場景:

    • 在前臺,我開始下載我的任務
    • 我去後臺和10秒後,切換到「aireplan模式」
    • 我所有的工作得到了一個錯誤。所以在方法URLSession:任務:didCompleteWithError:我恢復他們使用 downloadTaskWithResumeData或如果我不能(因爲有些沒有 足夠的恢復數據)我創建一個新的任務,而不恢復它(除非網絡回來那時候)。
    • 然後我把無線網絡了
    • 正如我仍然在後臺時,網絡又回來了,而無需啓動應用程序,我不能觸發「恢復」 ...

如何解決這些問題?我錯過了什麼嗎?

+0

我分享你的失望。你提到你在等待Apple的回答。你有沒有收到他們的消息?分辨率是多少? – gavdotnet

+0

與蘋果有很多交流,但沒有成果,建議使用酌情處理這些案件(但沒有及時獲得結果)的標誌。這種模式不是我的目標,我沒有把重點放在這個上,但是我的測試沒有成功。如果你已經測試了這個部分,那麼獲取信息仍然很有趣。 – Gros

回答

3

正如我仍然在後臺我不能觸發「恢復」時,網絡又回來了,而無需啓動應用程序...


你可以使用「背景提取」,當應用程序被取推出,那麼你可以檢查網絡並恢復下載任務。

+0

這可能是一種解決方法...現在就等待Apple的答案。 – Gros

+0

@Gros你從蘋果公司得到了關於這個問題的答案嗎?我有同樣的問題。 – Keith

+0

這個任何詞? – Siriss

2

您應該使用後臺配置創建NSURLSession,然後將您的任務發送給後臺惡魔,並在完成後調用您的應用。

2

實現:

application:handleEventsForBackgroundURLSession:completionHandler: 
在應用程序委託

- 無需調用completionHandler - 使設備的連接丟失後,同時暫停該應用程序掛在後臺左右。這樣,應用程序仍然可以監聽可達性通知,並在網絡連接再次可用時重新啓動下載。但是,這是一個非常不方便的方法,可能無法通過Apple的應用商店提交指南。另外,當應用程序處於前臺時連接丟失並且在應用程序暫停時重新獲得連接時,此方法沒有多大幫助。

最後我做了以下內容:

  • 利用了application:handleEventsForBackgroundURLSession:completionHandler:通知暫停我在後臺下載。
  • 利用間歇性後臺獲取通知(即application:performFetchWithCompletionHandler:completionHandler)檢查連接狀態並重新啓動任何已暫停的下載。 (帽尖@gugupluto)

這仍然沒有提供最佳的下載性能,並可能導致用戶想知道爲什麼他們的「後臺下載」尚未完成,一旦他們重新打開該應用程序,但它似乎是我們現在可以從蘋果公司獲得最好的希望。

+0

據我可以告訴應用程序有一定的時間(約30秒)來調用完成處理程序通過,如果它不這樣做,然後它會被看門狗,*除* *調試,即通過Xcode啓動,這可以使一些開發人員認爲忽略完成處理程序是一種有效的解決方法,當它不是。 –

+0

@ oscahie這是有道理的,但當我在iPad第四代測試它時,這並不是我所見證的。該應用似乎無限期地保留在後臺,並對網絡可達性通知作出響應。 – gavdotnet