我实际上是在应用程序中实现下载功能。 我正面临一个非常奇怪的错误AVAssetDownloadTask。
确实在当天开始下载资产的实施工作正在进行中。
当我在新创建的resume
上调用AssetDownloadTask
函数时,下载立即开始,AVAssetDownloadDelegate
函数
func urlSession(
_ session:URLSession,
assetDownloadTask:AVAssetDownloadTask,
didLoad timeRange:CMTimeRange,
totalTimeRangesLoaded loadedTimeRanges:[NSValue],
timeRangeExpectedToLoad:CMTimeRange
)
被调用并显示了主动下载任务的进度。
但在当天的某个时刻,这个过程停止了。现在,当我尝试启动/恢复时AssetDownloadTask
没有任何反应。
没有调用AVAssetDownloadDelegate
函数来进行下载。这就像什么都没发生一样。我甚至没有收到错误。
奇怪的是,如果我取消了AssetDownloadTask
func urlSession( _ session:URLSession, assetDownloadTask:AVAssetDownloadTask, didFinishDownloadingTo location:URL )
和
func urlSession(
_ session: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)")
}
}
提前感谢您提供任何帮助,让我试一试。 无法弄清楚它是否来自设备/代码/操作系统版本
致以最诚挚的问候,
马丁