iOS11 下载之断点续传的bug

作者: 卢叁 | 来源:发表于2017-11-02 14:52 被阅读247次

iOS11发布之后,可能很多带有下载功能的APP都会躺枪(ps:埋怨苹果爸爸几秒钟)。因为原先用来做断点续传的resumeData里带上了一个新值,而这个新值的出现,会导致几次暂停操作后下载任务task读取数据不对,而且在文件还没下载完时就会调用下载完成时的代理方法,导致下载出错。下面就来说说解决的办法。
第一种方法:暂停时不调用[task cancelByProducingResumeData:^(NSData *resumeData){ }];而是调用suspend线程挂起的方法,可解决这个问题。

第二种方法:去除resumeData里的新值。
1:第一步:先把resumeData转成string。

 NSString *dataString =[[NSString alloc]initWithData:resumeData encoding:NSUTF8StringEncoding];

2:第二步:再去除里面的新值

 NSString *string =[self cleanResumeDataWithString:dataString];
-(NSString *)cleanResumeDataWithString:(NSString *)dataString {
    if([dataString containsString:@"<key>NSURLSessionResumeByteRange</key>"]) {
        NSRange rangeKey = [dataString rangeOfString:@"<key>NSURLSessionResumeByteRange</key>"];
        NSString *headStr = [dataString substringToIndex:rangeKey.location];
        NSString *backStr = [dataString substringFromIndex:rangeKey.location];
        
        NSRange rangeValue = [backStr rangeOfString:@"</string>\n\t"];
        NSString *tailStr = [backStr substringFromIndex:rangeValue.location + rangeValue.length];
        dataString = [headStr stringByAppendingString:tailStr];
        
    }
    return dataString;
}

第3步:把string转成新的resumeData。

 resumeData =[string dataUsingEncoding:NSUTF8StringEncoding];

后记:第一种方法相对简单,第二种相对有难度些。小伙伴可根据情况酌情使用。

相关文章

  • iOS11 下载之断点续传的bug

    iOS11发布之后,可能很多带有下载功能的APP都会躺枪(ps:埋怨苹果爸爸几秒钟)。因为原先用来做断点续传的re...

  • iOS Session 断点续传出错

    iOS Session 下载 ,在iOS 11 下断点续传总是时好时坏,对比iOS10和iOS11 的 resum...

  • ios NSURLSessionDownloadTask tot

    BUG出现 以前用NSURLSessionDownloadTask做的一个伪断点续传下载,使用很长时间后由于服务器...

  • Android下载文件(一)下载进度&断点续传

    索引 Android下载文件(一)下载进度&断点续传 Android下载文件(二)多线程并发&断点续传(待续) A...

  • Okhttp多线程断点续传

    目录 1、断点续传相关定义2、多线程下载实现方案 1、断点续传相关定义 1.1、断点续传: 记录上次下载的位置,下...

  • NSURLSession实现断点下载

    断点续传概述 断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头。(本文的断点续传仅涉及下载...

  • IOS 断点续传原理浅析(第一篇)

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • iOS-16 断点续传 下载

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • android 中断点续传

    android 中断点续传 单线程断点续传 所谓的断点续传就是在下载一个文件时,文件没有完全下载,中途暂停,那么再...

  • 2019-08-19

    视频断点续传与下载

网友评论

  • cc412:更新一下吧,iOS11.3以后resumeData就没有这个值了。iOS12后resumeData用NSUTF8StringEncoding转NSString为nil,所以String不判断nil会造成Crash。看起来应该是iOS11版本初期的bug,后来苹果给修复了
    卢叁:@cc412 iOS12直接使用resumeData就行
  • TheBlueNight:iOS 11.4下,这个方式还是会挂在 - downloadTaskWithResumeData: , 楼主有解决对策吗?
    卢叁:@TheBlueNight 是的 我也是用这种方案
    TheBlueNight:@卢叁 我项目上是完全放弃了系统提供的断点续传方案,改为自己管理临时文件,来实现断点续传。
    卢叁:@TheBlueNight 嗯嗯 这个还没有 可以换种思路解决
  • cc412:�被这个问题坑了一天,也是对比了ResumeData才发现的!!神坑!感谢博主
    卢叁:@cc412 哈哈哈 别客气别客气
  • 28837dab7065:找了好长时间资料,最后打印了resumeData进行对比才发现多了一个NSURLSessionResumeByteRange,搜索这个关键字才找到这里,不容易啊
    卢叁:这个问题确实挺坑的 😂
  • 没梦想的咸鱼2:第二种方法无效啊 怎么破?
    卢叁:@施孝达 对 删除resumeData的新值 再用resumeData创建task task = [self.session downloadTaskWithResumeData:resumeData];
    没梦想的咸鱼2:@卢叁 找不到 ,依然发生文件大小 不对的问题 ,是在cancelByProducingResumeData的block里面删除resumeData的新值吗?
    卢叁:@施孝达 有效啊 找找原因
  • EvenTime:楼主可以,我们都在修改里面的东西,直接去掉就可以了,亏我还觉得那个键挺合理的....那iOS 10需要另外处理吗? suspend 在程序杀掉后能恢复吗?(这个还真没试过,写的时候就用的resumedData),楼主很棒.
    卢叁:@_xiaoChun 10不用处理
    EvenTime:@卢叁 嗯嗯,我也这么想的。
    卢叁:@_xiaoChun suspend 在程序杀掉后是不能恢复的

本文标题:iOS11 下载之断点续传的bug

本文链接:https://www.haomeiwen.com/subject/hqwopxtx.html