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)
但不幸的是,它不会恢复下载
所以我的问题是
实际上,您可以使用getAllTasks(completionHandler:)]获取上次启动时未完成的待处理任务,但不知何故,这些任务将在创建下载会话后立即取消,这会导致urlSession(_:task:didCompleteWithError:)调用,如您所见。
幸运的是,我找到了另一种恢复方式 AVAssetDownloadTask
AVAssetDownloadTask 提供在某些情况下恢复先前停止的下载的能力。为此,只需使用一个 AVURLAsset 实例化一个新的 AVAssetDownloadTask,该 AVURLAsset 用一个文件 NSURL 实例化,该文件指向具有所需下载选项的部分下载的包,下载将继续恢复任何以前下载的数据。
这意味着如果要恢复挂起的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()
}
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
| 归档时间: |
|
| 查看次数: |
1272 次 |
| 最近记录: |