5

我使用此代碼創建一個後臺會話恢復...NSURLSessionDownloadTask攤位的背景下,緩慢前景

let configuration = URLSessionConfiguration.background(withIdentifier: UUID().uuidString) 
    configuration.sessionSendsLaunchEvents = true 
    configuration.isDiscretionary = false 
    self.session = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

...和下​​載任務:

let downloadTask = self.session.downloadTask(with: request as URLRequest)   
    downloadTask.resume() 

我請求對象如下所示:

let request = NSMutableURLRequest(url: someURL) 
    request.httpMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    do { 
     try request.httpBody = JSONSerialization.data(withJSONObject: someDictionary, options: JSONSerialization.WritingOptions()) 
    } catch let error as NSError { 
     // logging calls 
    } 

正在下載的資源是〜20MB zip文件。

我可以在前臺運行四個併發下載,沒有問題。所有預期的委託方法都被調用並且傳輸以正常的速度完成。

我看到的問題是,如果我在前臺開始下載並點擊主頁按鈕,則下載有時會停止。我試着讓設備保持清醒狀態,網絡旋轉了一個小時,傳輸仍然沒有在後臺完成。此外,當我將應用程序帶回前臺時,傳輸不會立即再次啓動。如果我讓應用程序坐在前臺大約4分鐘,他們會醒來並重新開始工作。他們以應用程序進入後臺時完成的百分比恢復,並以正常速度傳輸直至完成。在任何時候都沒有任何錯誤,並且轉移最終是成功的。它只是在背景中「消失」,並且在應用程序回到前臺時恢復非常緩慢。

我在運行iOS 10的iPhone 6上測試。我沒有連接到Xcode或外部電源,我正在啓動應用程序。我可以通過WiFi和蜂窩連接重現問題。我刪除了應用程序並重新加載了多次。

我無法跟蹤這個問題,因爲大約20%的時間工作正常。我沒有找到任何導致它一致工作或失敗的特定變量。當發生多次下載時,它似乎更頻繁地發生,並且在這種情況下,所有下載都會顯示上述行爲。

任何指導將不勝感激!

馬特

+0

您是否嘗試過其他會話配置?不是背景 – iWheelBuy

回答

0

你描述聽起來像iOS的一個bug,也有一些是我想嘗試的行爲:

  • 嘗試設置酌情爲YES。這限制了後臺重新啓動的速度。
  • 確保您在一次啓動期間不會意外創建一個具有與現有ID相同的ID的新後臺會話(除非剛剛重新啓動以處理事件,並且僅在調用完成處理程序後)。
  • 確保您沒有創建任何涉及的類的子類 - 特別是NSURL或NSURLRequest。
  • 嘗試設置shouldUseExtendedBackgroundIdleMode爲YES。
  • 嘗試在UIBackgroundModes中添加啓用背景獲取。

最後兩個都不應該有幫助,如果他們這樣做,請提交一個錯誤。另外,IIRC,如果您的應用在後臺重新啓動太多次,可能會受到處罰,所以如果您在後臺任務中製作了一堆短的請求,那麼您可能不應該這樣做。如果您的應用在後臺重新啓動時崩潰,那也可能非常糟糕。

最後,請確保您剛剛進入主屏幕。如果您強制退出應用程序(雙擊,滑動),後臺請求會終止。這是預期的行爲。

如果這些提示都無法提供幫助,請在bugreporter.apple.com上提交錯誤報告,因爲您描述的內容不是預期的行爲。