如何判断URLSession下载任务是否可续传?需服务端配置吗?
iOS 下载续传问题解析
什么样的下载任务支持续传?
- 仅限基于HTTP/HTTPS协议的
URLSessionDownloadTask任务,普通URLSessionDataTask无法使用系统原生续传机制 - 下载资源必须是可按字节范围请求的静态资源,动态生成内容(比如每次请求返回结果不同的接口)无法支持续传
- 任务中断时必须处于活跃下载状态,未启动的任务中断不会生成续传数据
是否需要服务端配置?
必须要,服务端需满足两个核心条件:
- 首次响应头返回
Accept-Ranges: bytes,明确告知客户端支持范围请求 - 当客户端发送带
Range: bytes=起始字节-的请求时,返回对应范围的内容,响应状态码为206 Partial Content,同时携带Content-Range头说明返回的字节区间
如果服务端不支持Range请求,客户端代码再规范也拿不到续传数据。
是否需要读取其他键?
不需要找其他键——苹果文档明确说明,没有NSURLSessionDownloadTaskResumeData就意味着当前场景无法续传。不过可以排查几个常见情况:
- 检查错误码:如果是
NSURLErrorNetworkConnectionLost这类网络中断错误但仍无续传数据,大概率是服务端不支持Range - 主动取消测试:主动中断任务时,可调用
cancel(byProducingResumeData:)方法尝试获取续传数据,但仅在任务处于活跃状态时有效 - 小文件特例:若下载文件体积极小,系统可能直接完成下载,不会生成续传数据
内容的提问来源于stack exchange,提问作者Tushar Sharma
相关产品推荐
相关产品推荐

