iOS恢复HLS下载并删除部分下载的文件

时间:2019-04-18 14:42:32

标签: ios swift hls

我正在按照Apple Docs

实现HLS流式传输

但是我面临的问题是当用户终止应用程序时恢复下载。如果正在进行下载,并说下载已完成50%,并且用户终止了该应用程序,或者该应用程序由于任何原因被系统终止,并且当该应用程序再次运行时,则称为didCompleteWithError的URL会话委托< / p>

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
}

在这里,我没有部分下载的文件路径,也没有恢复任务的能力。

下载完成后,将通过以下委托调用调用下载文件的唯一位置

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
}

现在医生说要使用

downloadSession.getAllTasks { tasksArray in }

但不幸的是,它无法恢复下载

所以我的问题是

  1. 如何从已下载状态恢复任务,以使整个下载不会从0%重新开始?
  2. 对于不可恢复的任务,或者对于我不想继续执行的特定情况,如何删除部分下载的文件?我将如何获得下载的路径(我不想搜索整个文档目录)

1 个答案:

答案 0 :(得分:1)

实际上,您可以使用getAllTasks(completionHandler:)]来获取在上一次启动时未完成的待处理任务,但是以某种方式,这些任务将在创建下载会话后立即取消,从而导致{{ 1}}如您所见。

幸运的是,我找到了另一种恢复urlSession(_:task:didCompleteWithError:)

的方法
  

AVAssetDownloadTask提供了在某些情况下恢复先前停止的下载的功能。为此,只需使用一个AVURLAsset实例化一个新的AVAssetDownloadTask,该AVURLAsset实例化一个具有所需下载选项的指向部分下载的包的NSURL文件,下载将继续还原以前下载的任何数据。

这意味着,如果要恢复挂起的AVAssetDownloadTask,则必须在停止下载任务时从AVAssetDownloadTask中保存location。之后,根据部分下载的文件创建另一个下载任务。

urlSession(_:assetDownloadTask:didFinishDownloadingTo:)

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) { destinationURL = location } func resumeDownloadTask() { let urlAsset = AVURLAsset(url: destinationURL) downloadTask = assetDownloadURLSession.makeAssetDownloadTask(asset: urlAsset, assetTitle: "title", assetArtworkData: nil, options: nil) downloadTask.resume() } 将始终在urlSession(_:assetDownloadTask:didFinishDownloadingTo:)之前被调用,因此在应用终止,重新启动或取消下载任务的两种情况下,您都可以获得urlSession(_:task:didCompleteWithError:)

请注意,您不应在destinationURL内创建新的下载任务,否则它将导致无限循环。

关于第二个问题,只需使用urlSession(_:task:didCompleteWithError:)删除文件即可。

有关更多详细信息,我在下面的链接中创建了一个示例存储库。仍然存在一些错误,但可以在正常情况下运行。尝试启动下载任务,让它运行一段时间并终止该应用程序。重新启动并继续执行任务,您将看到结果。

https://github.com/trungducc/stackoverflow/tree/hls-download-resuming