0

我实际上是在应用程序中实现下载功能。我面临着一个非常奇怪的 AVAssetDownloadTask 错误。

实际上,在一天开始时,下载资产的实现是有效的。

当我resume在我AssetDownloadTask的新创建的函数上调用该函数时,下载立即开始并且该AVAssetDownloadDelegate函数

func urlSession(
       _会话:URLSession,
       assetDownloadTask:AVAssetDownloadTask,
       didLoad timeRange:CMTimeRange,
       totalTimeRangesLoadedloadedTimeRanges:[NSValue],
       timeRangeExpectedToLoad:CMTimeRange

被调用并显示活动下载任务的进度。

但是在一天中的某一时刻,该过程停止了工作。现在,当我尝试启动/恢复时,AssetDownloadTask什么也没有发生。AVAssetDownloadDelegate下载进程不会调用任何函数。就像什么都没有发生一样。我什至没有收到错误。

奇怪的是,如果我取消了AssetDownloadTask这个

func urlSession(_会话:URLSession,assetDownloadTask:AVAssetDownloadTask,didFinishDownloadingTo location:URL)

func urlSession(
       _会话:URLSession,
      任务:URLSessionTask,
      didCompleteWithError错误:错误?

正确地调用表明该过程似乎以某种方式暂停。

在 IOS 11 上运行的设备上,我似乎没有任何这些问题。

我想知道你们中是否有人有一个想法可以解释为什么我AssetDownloadTask无法在 IOS 10.3 设备上启动/恢复。

您将在下面找到我的下载管理器的几个部分。

let backgroundConfiguration = URLSessionConfiguration.background(withIdentifier: "\(Bundle.main.bundleIdentifier!).background")
    // Create the AVAssetDownloadURLSession using the configuration.
assetDownloadURLSession = AVAssetDownloadURLSession(configuration: backgroundConfiguration, assetDownloadDelegate: self, delegateQueue: OperationQueue.main)
private var activeDownloadsMap = [AVAssetDownloadTask: XXXXXXX]()   

func downloadAsset(for asset: XXXXX) {

    // Get the default media selections for the asset's media selection groups.
    let preferredMediaSelection = asset.geturlAsset().preferredMediaSelection


    if #available(iOS 10.0, *) {
        guard let task = assetDownloadURLSession.makeAssetDownloadTask(asset: asset.geturlAsset(),
                                                                                                                                     assetTitle: asset.title,
                                                                                                                                     assetArtworkData: nil,
                                                                                                                                     options: nil) else { return }

        // To better track the AVAssetDownloadTask we set the taskDescription to something unique for our sample.
        task.taskDescription = asset.title

        activeDownloadsMap[task] = asset

        task.resume()
    } else {
        return
    }
}       


extension DownloadManager: AVAssetDownloadDelegate {
public func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {
    // This delegate callback should be used to provide download progress for your AVAssetDownloadTask.
    guard let asset = activeDownloadsMap[assetDownloadTask] else { return }

    var percentComplete = 0.0
    for value in loadedTimeRanges {
        let loadedTimeRange: CMTimeRange = value.timeRangeValue
        percentComplete +=
            CMTimeGetSeconds(loadedTimeRange.duration) / CMTimeGetSeconds(timeRangeExpectedToLoad.duration)
    }

    debugPrint("DOWNLOAD: Progress \( assetDownloadTask) \(percentComplete)")


}
}

提前感谢您为我提供的任何帮助以尝试解决此问题。无法确定它是否来自设备/代码/操作系统版本

此致,

马丁

4

0 回答 0