最近下载视频遇到限速,限到无法忍受
观察了一下:
1.下载前请求文件所有备份地址,能断点续传
2.单独请求这个地址也会有一定的限速,但好过直接从应用里请求时的速度,差不多高10-20倍
3.使用提速机会时随机生成token
4.客户端定时发送请求,提速机会完成时,请求结果变化然后恢复限速
突破点其实很多,为了顺便实践下iOS上文件下载的管理,定了这么一个方案:
根据本地带宽和限速信息,生成多个请求,从不同的range开始下载,下载完成后合并文件
延期的工程
但结果有点不尽人意:第三方下载器直接下载资源地址也经常停滞,下载速度为0。于是这套方案近期不再维护,等做完第二版的应用再来做一个真正的分段下载器,做点记录:
工程基于AFNetworking3.0+开发,省去了对请求头、响应报文的一些处理
1.发一起一个breakertask(自定义名称)进行下载
2.开始下载,task请求文件总大小。
2-1)拓展:目前通过发起完整请求,progress获取后取消请求来处理,是否有更好的方式
2-2)拓展:目前在下载方法调用时请求,如果在初始化时请求,考虑下载方法调用a与请求文件总大小b的时机,a调用时b在执行中则需要记录a已经调用过并在b完成后真正开始a。
3.再根据传入的带宽和限速信息,计算适当的请求数,发起urlsessiondownloadtask
3-1).发起urlsessiondownloadtask:1)构造NSURLRequest,加入range信息2.生成downloadtask,记录相关信息:请求过程、请求结果、临时存储地址
3-2)拓展:目前主动计算请求数,可以计算过程抽取作为智能分配任务逻辑
3-3) 拓展:目前所有请求直接发起,可以创建待发起请求队列,设置最大并发请求
4.urlsessiondownloadtask更新时汇总progress
4-1)拓展:目前监听task的progress新、旧值,有没有更好的方法,或者考虑直接监听task的变化放弃AFNetworking的progress的处理
5.urlsessiondownloadtask结束时通知需要更新文件
5-1)拓展:失败时加入重连机制
6.按序拼接文件
6-1)完善:判断是否为最后一次文件拼接,如果是调用任务结束回调
6-2)拓展:删除临时文件
7.完善:
1)加入暂停功能
2)调试进入app后台时的请求
3)breakertask的管理器考虑对多个task进行管理,但基于目前的自动分配任务,不会并发多个breakertask,但需要自动进行下个breakertask
breakertask