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

Gir*_*air 5 http-live-streaming ios swift

我正在按照Apple Docs实施 HLS 流

但是我面临的问题是在用户终止应用程序时恢复下载。如果下载正在进行并说它已完成 50% 并且用户终止应用程序或应用程序因任何原因被系统终止,并且当应用程序再次活动时,didCompleteWithError则调用URL 会话委托

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
}
Run Code Online (Sandbox Code Playgroud)

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

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

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
}
Run Code Online (Sandbox Code Playgroud)

现在医生说要使用

downloadSession.getAllTasks { tasksArray in }
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它不会恢复下载

所以我的问题是

  1. 如何从下载状态恢复任务,以便整个下载不会从 0% 重新开始?
  2. 对于不可恢复的任务或对于我不想恢复的特定场景,如何删除部分下载的文件?我将如何获取下载的路径(我不想搜索整个文档目录)

tru*_*duc 6

实际上,您可以使用getAllTasks(completionHandler:)]获取上次启动时未完成的待处理任务,但不知何故,这些任务将在创建下载会话后立即取消,这会导致urlSession(_:task:didCompleteWithError:)调用,如您所见。

幸运的是,我找到了另一种恢复方式 AVAssetDownloadTask

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

这意味着如果要恢复挂起的AVAssetDownloadTask,则必须locationurlSession(_: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()
}
Run Code Online (Sandbox Code Playgroud)

urlSession(_:assetDownloadTask:didFinishDownloadingTo:)将始终在之前被调用,urlSession(_:task:didCompleteWithError:)因此您可以destinationURL在应用程序终止并重新启动或下载任务被取消时获得这两种情况。

请注意,您不应在 内创建新的下载任务urlSession(_:task:didCompleteWithError:),否则会导致无限循环。

对于您的第二个问题,只需使用destinationURL.

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

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