如何从URLSessionDownloadTask失败的Error对象中获取ResumeData?
从NSURLErrorDomain错误中提取ResumeData
嘿,我懂你这种抓心挠肝的感觉——调试器明明显示Error里藏着ResumeData,可代码里就是摸不到它!别慌,这事儿我遇过,其实是因为resumeData被放在Error的userInfo字典里,只是需要用正确的键去提取。
具体解决方案:
你可以直接通过NSURLSessionDownloadTaskResumeData这个键,从错误的userInfo中取出resumeData,下面是具体代码示例:
Swift版本:
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { guard let error = error else { // 下载完成无错误,正常处理 return } // 先确认错误属于NSURLErrorDomain guard error.domain == NSURLErrorDomain else { // 其他类型错误,按常规逻辑处理 return } // 尝试提取resumeData if let resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData] as? Data { // 拿到resumeData啦!可以用它恢复下载任务 let resumeTask = session.downloadTask(withResumeData: resumeData) resumeTask.resume() } }
Objective-C版本:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (!error) { // 下载完成无错误,正常处理 return; } // 确认错误域为NSURLErrorDomain if ([error.domain isEqualToString:NSURLErrorDomain]) { // 提取resumeData NSData *resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData]; if (resumeData) { // 恢复下载任务 NSURLSessionDownloadTask *resumeTask = [session downloadTaskWithResumeData:resumeData]; [resumeTask resume]; } } }
一些关键注意点:
- 不是所有
NSURLErrorDomain的错误都包含resumeData,只有当任务处于可恢复状态时才会存在(比如主动取消的任务,错误码-999,或者部分下载后因网络问题失败的任务)。 - 虽然
NSURLSessionDownloadTaskResumeData看起来像私有API,但Apple在实际开发中是允许使用的,很多主流的第三方下载库也都依赖这个键来实现断点续传功能。 - 你在调试器里看到的
debugDescription内容,本质上就是把Error的userInfo字典内容打印出来了,所以我们直接从userInfo里取值就好,不用纠结debugDescription的文本解析。
内容的提问来源于stack exchange,提问作者Nikhil Gupta
相关产品推荐
相关产品推荐

