Progress tracking does not work after the download has been paused and resumed

Hello,

I recently started integrating HLS downloads into my application by using AVAssetDownloadTask and AVAssetDownloadConfiguration. I took an example from the documentation as a basis, with only one small difference: the minimum target for my application is iOS 16, so I replaced urlSession(_:assetDownloadTask:willDownloadTo:) with urlSession(_:assetDownloadTask:didFinishDownloadingTo:).

And I encountered the following issue: after pausing a download and resuming it later, the progress no longer functions as expected.

Could you, please, help me with this? What are the right approaches to implementing pause and progress tracking?


Some details:

I used devices with iOS 16.0.2 and 17.6.1 for testing.

There was no code in the example that pauses the download and resumes it. So, I used the following methods to do this: suspend and resume

Also, I have tried to track downloading progress using two different approaches:

  1. Using task.progress.observe(\.fractionCompleted) { ... }, which was presented in the example. In this scenario, after a pause, an observation callback will only be called once, when the download has completed, despite the fact that data is being successfully downloaded over the network.
  2. Using urlSession(_:assetDownloadTask:didLoad:totalTimeRangesLoaded:timeRangeExpectedToLoad:) and calculating progress as totalTimeRangesLoaded.reduce(0.0) { $0 + CMTimeGetSeconds($1.timeRangeValue.duration) / CMTimeGetSeconds(timeRangeExpectedToLoad.duration) }. In this scenario, I have noticed that the result of the calculation does not always increase, but sometimes there are outliers. Example of logs: 68%, 69%, 70%, 72%, 63%, 65%, 66%, 69%, 70%, 71%, 72%. Such fluctuations are most easily reproduced when I try to resume the download after pause. However, sometimes they occur spontaneously. It's important to mention, that this method marked as deprecated, perhaps for this reason.

In both cases download is successful, the problem is with progress reporting only.

Full version of code can be found here.

Progress tracking does not work after the download has been paused and resumed
 
 
Q