NSURLSessionDownloadTask摊位的背景下,缓慢前景

问题描述:

我使用此代码创建一个后台会话恢复...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

你描述听起来像iOS的一个bug,也有一些是我想尝试的行为:

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

最后两个都不应该有帮助,如果他们这样做,请提交一个错误。另外,IIRC,如果您的应用在后台重新启动太多次,可能会受到处罚,所以如果您在后台任务中制作了一堆短的请求,那么您可能不应该这样做。如果您的应用在后台重新启动时崩溃,那也可能非常糟糕。

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

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