You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:31