我正在按照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 }
但不幸的是,它无法恢复下载
所以我的问题是
答案 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