iOS11 下載之斷點續傳的bug

盧三發表於2017-12-20

iOS11釋出之後,可能很多帶有下載功能的APP都會躺槍(ps:埋怨蘋果爸爸幾秒鐘)。因為原先用來做斷點續傳的resumeData裡帶上了一個新值,而這個新值的出現,會導致幾次暫停操作後下載任務task讀取資料不對,而且在檔案還沒下載完時就會呼叫下載完成時的代理方法,導致下載出錯。之所以出現這個錯誤,是因為iOS11以後resumentData中帶有一個NSURLSessionResumeByteRange的新值。下面就來說說解決問題的辦法: 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];
複製程式碼

問題解決!

相關文章