123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- //
- // NSURLSession+CorrectedResumeData.m
- // jiaPei
- //
- // Created by 张嵘 on 2018/12/4.
- // Copyright © 2018 JCZ. All rights reserved.
- //
- #import "NSURLSession+CorrectedResumeData.h"
- static NSString *const resumeCurrentRequest = @"NSURLSessionResumeCurrentRequest";
- static NSString *const resumeOriginalRequest = @"NSURLSessionResumeOriginalRequest";
- @implementation NSURLSession (CorrectedResumeData)
- - (NSURLSessionDownloadTask *)downloadTaskWithCorrectResumeData:(NSData *)resumeData
- {
- NSData *data = [self getCorrectResumeDataWithData:resumeData];
- data = data ? data : resumeData;
- NSURLSessionDownloadTask *task = [self downloadTaskWithResumeData:data];
- NSMutableDictionary *resumeDic = [self getResumeDictionaryWithData:data];
-
- if (resumeDic) {
- if (!task.originalRequest) {
- NSData *originalReqData = resumeDic[resumeOriginalRequest];
- NSURLRequest *originalRequest = [NSKeyedUnarchiver unarchiveObjectWithData:originalReqData];
- if (originalRequest) [task setValue:originalRequest forKey:@"originalRequest"];
- }
- if (!task.currentRequest) {
- NSData *currentReqData = resumeDic[resumeCurrentRequest];
- NSURLRequest *currentRequest = [NSKeyedUnarchiver unarchiveObjectWithData:currentReqData];
- if (currentRequest) [task setValue:currentRequest forKey:@"currentRequest"];
- }
- }
-
- return task;
- }
- - (NSData *)getCorrectResumeDataWithData:(NSData *)data
- {
- if (!data) return nil;
-
- NSMutableDictionary *resumeDictionary = [self getResumeDictionaryWithData:data];
- if (!resumeDictionary) return nil;
-
- resumeDictionary[resumeCurrentRequest] = [self getCorrectRequestDataWithData:resumeDictionary[resumeCurrentRequest]];
- resumeDictionary[resumeOriginalRequest] = [self getCorrectRequestDataWithData:resumeDictionary[resumeOriginalRequest]];
-
- return [NSPropertyListSerialization dataWithPropertyList:resumeDictionary format:NSPropertyListXMLFormat_v1_0 options:0 error:nil];
- }
- - (NSMutableDictionary *)getResumeDictionaryWithData:(NSData *)data
- {
- return [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:nil error:nil];
- }
- - (NSData *)getCorrectRequestDataWithData:(NSData *)data
- {
- if (!data) return nil;
-
- if ([NSKeyedUnarchiver unarchiveObjectWithData:data]) return data;
-
- NSMutableDictionary *archive = [[NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:nil error:nil] mutableCopy];
- if (!archive) return nil;
-
- NSInteger i = 0;
- id objectss = archive[@"$objects"];
- while ([objectss[1] objectForKey:[NSString stringWithFormat:@"$%ld", i]]) {
- i++;
- }
-
- NSInteger j = 0;
- while ([archive[@"$objects"][1] objectForKey:[NSString stringWithFormat:@"__nsurlrequest_proto_prop_obj_%ld", j]]) {
- NSMutableArray *array = archive[@"$objects"];
- NSMutableDictionary *dic = array[1];
- id obj = [dic objectForKey:[NSString stringWithFormat:@"__nsurlrequest_proto_prop_obj_%ld", j]];
- if (obj) {
- [dic setValue:obj forKey:[NSString stringWithFormat:@"$%ld", i + j]];
- [dic removeObjectForKey:[NSString stringWithFormat:@"__nsurlrequest_proto_prop_obj_%ld", j]];
- [array replaceObjectAtIndex:1 withObject:dic];
- archive[@"$objects"] = array;
- }
- j++;
- }
-
- if ([archive[@"$objects"][1] objectForKey:@"__nsurlrequest_proto_props"]) {
- NSMutableArray *array = archive[@"$objects"];
- NSMutableDictionary *dic = array[1];
- id obj = [dic objectForKey:@"__nsurlrequest_proto_props"];
- if (obj) {
- [dic setValue:obj forKey:[NSString stringWithFormat:@"$%ld", i + j]];
- [dic removeObjectForKey:@"__nsurlrequest_proto_props"];
- [array replaceObjectAtIndex:1 withObject:dic];
- archive[@"$objects"] = array;
- }
- }
-
- if ([archive[@"$top"] objectForKey:@"NSKeyedArchiveRootObjectKey"]) {
- [archive[@"$top"] setObject:archive[@"$top"][@"NSKeyedArchiveRootObjectKey"] forKey: NSKeyedArchiveRootObjectKey];
- [archive[@"$top"] removeObjectForKey:@"NSKeyedArchiveRootObjectKey"];
- }
-
- return [NSPropertyListSerialization dataWithPropertyList:archive format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil];
- }
- @end
|