NSURLSessionDownloadTask在后台停止,在前台恢复缓慢

时间:2016-10-03 17:17:00

标签: ios background nsurlsession transfer 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%的时间它工作正常。我没有发现任何特定的变量集导致它一致地工作或失败。当发生多次下载时,似乎更频繁地发生,并且在这种情况下,所有下载都表现出上述行为。

非常感谢任何指导!

马特

1 个答案:

答案 0 :(得分:0)

您描述的行为听起来像iOS中的错误,但我会尝试的一些事情是:

  • 尝试自行设定为YES。这限制了背景重新启动的速度。
  • 确保您不会意外地创建一个与现有会话具有相同ID的新后台会话(除非您刚刚重新启动以处理事件,并且仅在调用完成处理程序之后)在单次启动期间。 / LI>
  • 确保您没有创建任何涉及的类的子类 - 特别是NSURL或NSURLRequest。
  • 尝试将shouldUseExtendedBackgroundIdleMode设置为YES。
  • 尝试在UIBackgroundModes中添加启用后台提取。

最后两个都不应该有所帮助,如果有,那就提出错误。

另外,IIRC,你的应用程序如果在后台重启太多次会受到惩罚,所以如果你在后台任务中发出一堆短请求,你可能不应该这样做。如果你的应用程序在后台重新启动时崩溃,那也可能非常糟糕。

最后,请确保您只是进入主屏幕。如果您强制退出应用程序(双击,滑动),后台请求将被终止。这是预期的行为。

如果这些提示都没有帮助,请在bugreporter.apple.com上提交错误报告,因为您所描述的不是预期的行为。