iOS断点续传如何获取已下载字节数
基于- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;
[self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
[resumeData writeToFile:tmpPath atomically:YES];
}];
//读字节数
NSMutableDictionary *resumeDataDic =[NSPropertyListSerialization propertyListWithData:resumeData options:NSPropertyListImmutable format:nil error:nil];
[resumeDataDic objectForKey:@"NSURLSessionResumeBytesReceived"]
网上很多教程教如何用这个方法实现断点续传,然而实际上我用这个方法并不能获取到已经下载的字节数
最后这样拿到了已下载字节数:
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resumeData];
NSMutableDictionary *unarchiverDict = [unarchiver decodeObjectForKey:@"NSKeyedArchiveRootObjectKey"];
[unarchiver finishDecoding];
NSString*bytesReceived = [unarchiver DictobjectForKey:@"NSURLSessionResumeBytesReceived"];
我折腾的过程:
首先我根据教程,将resumeData保存成.plist文件查看

长这样,长这样那当然是无法通过
NSMutableDictionary *resumeDataDic =[NSPropertyListSerialization propertyListWithData:resumeData options:NSPropertyListImmutable format:nil error:nil];
[resumeDataDic objectForKey:@"NSURLSessionResumeBytesReceived"]
获取到下载的字节数啦.
后面突然发现一个关键字:NSKeyedArchiver
这个是数据归档,我是熟悉的,只不过我没有查看过数据归档后的文件长什么样.
所以我就随便归档了一个数据,并保存成.plist文件看看是怎样的.
发现跟resumeData保存成plist文件文档格式是完全一致的
所以苹果是将这个数据先归档再传给我们,那么我们只要解档就可以查看数据了
*解档过程:
首先将文件当成.plist 文件转成字典
NSMutableDictionary *resumeDataDic =[NSPropertyListSerialization propertyListWithData:resumeData options:NSPropertyListImmutable format:nil error:nil];
然后将这个字典打印出来

主要查看下半部分,classname代表这个归档是用什么类打包的, $top对应这个归档是用什么key去encode的
那么接下来就是常规的解档:
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:resumeData];
NSMutableDictionary *unarchiverDict = [unarchiverdecodeObjectForKey:@"NSKeyedArchiveRootObjectKey"];
[unarchiver finishDecoding];

从这字典中获取你所需要的下载路径,临时文件,已下载字节数,日期等