NSURLSessionDownloadTask 在挂起时继续下载



我正在使用NSURLSessionDownloadTask下载文件。在应用程序中的某一时刻,有必要暂停下载一小段时间,然后恢复下载。我尝试使用暂停方法暂停下载,但任务继续下载。NSURLSessionTask方法挂起状态的Apple文档:

任务在挂起时不会产生网络流量,并且不会发生超时。下载任务可以在以后继续传输数据。所有其他任务必须在恢复时重新开始。

这似乎表明我正在做的事情是正确的,但结果并不像预期的那样。我能够在操场上使用以下代码重现它。

import UIKit
let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "some-identifier")
let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: nil, delegateQueue: nil)
let request = URLRequest(url: URL(string: "http://google.com")!)
let task = backgroundSession.downloadTask(with: request)
task.state.rawValue
task.resume()
task.state.rawValue
task.suspend()
task.state.rawValue
sleep(10)
task.state.rawValue

任务状态的预期结果为 1、0、1、1(0- 正在下载,1 - 挂起,2 - 取消,3 - 完成)。实际结果为 1、0、1、3。这意味着,尽管任务已挂起,但它仍会继续下载,并在下载完成后将其标记为完成。

应用程序中的设置更加复杂,任务状态不能总是复制(在 Playground 中,结果似乎总是相同的),但暂停任务后的结果始终是文件已成功下载(包括调用进度回调)。

问题:我做错了什么吗?我是否误解了Apple文档,无法以这种方式暂停下载任务?

在应用程序中遇到此问题时,我的第一个直觉是我在其他地方调用 resume 导致下载继续,但在调试代码后似乎并非如此 + Playground 发现也支持这一点。

可能不是您要找的答案,但Apple开发人员关系代表已在其开发人员论坛中确认,在某些情况下,使用suspend无法真正暂停后台下载:

[...]挂起的任务仍然可以在网络上处于活动状态;suspend所做的只是阻止它在内部取得进展,发出回调等等。

他们继续建议改用cancel(byProducingResumeData:)

如果要实现长期暂停(例如,用户想要暂停下载),则最好调用-cancelByProducingResumeData:

最新更新