NSURLSession+CorrectedResumeData.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // NSURLSession+CorrectedResumeData.m
  3. // jiaPei
  4. //
  5. // Created by 张嵘 on 2018/12/4.
  6. // Copyright © 2018 JCZ. All rights reserved.
  7. //
  8. #import "NSURLSession+CorrectedResumeData.h"
  9. static NSString *const resumeCurrentRequest = @"NSURLSessionResumeCurrentRequest";
  10. static NSString *const resumeOriginalRequest = @"NSURLSessionResumeOriginalRequest";
  11. @implementation NSURLSession (CorrectedResumeData)
  12. - (NSURLSessionDownloadTask *)downloadTaskWithCorrectResumeData:(NSData *)resumeData
  13. {
  14. NSData *data = [self getCorrectResumeDataWithData:resumeData];
  15. data = data ? data : resumeData;
  16. NSURLSessionDownloadTask *task = [self downloadTaskWithResumeData:data];
  17. NSMutableDictionary *resumeDic = [self getResumeDictionaryWithData:data];
  18. if (resumeDic) {
  19. if (!task.originalRequest) {
  20. NSData *originalReqData = resumeDic[resumeOriginalRequest];
  21. NSURLRequest *originalRequest = [NSKeyedUnarchiver unarchiveObjectWithData:originalReqData];
  22. if (originalRequest) [task setValue:originalRequest forKey:@"originalRequest"];
  23. }
  24. if (!task.currentRequest) {
  25. NSData *currentReqData = resumeDic[resumeCurrentRequest];
  26. NSURLRequest *currentRequest = [NSKeyedUnarchiver unarchiveObjectWithData:currentReqData];
  27. if (currentRequest) [task setValue:currentRequest forKey:@"currentRequest"];
  28. }
  29. }
  30. return task;
  31. }
  32. - (NSData *)getCorrectResumeDataWithData:(NSData *)data
  33. {
  34. if (!data) return nil;
  35. NSMutableDictionary *resumeDictionary = [self getResumeDictionaryWithData:data];
  36. if (!resumeDictionary) return nil;
  37. resumeDictionary[resumeCurrentRequest] = [self getCorrectRequestDataWithData:resumeDictionary[resumeCurrentRequest]];
  38. resumeDictionary[resumeOriginalRequest] = [self getCorrectRequestDataWithData:resumeDictionary[resumeOriginalRequest]];
  39. return [NSPropertyListSerialization dataWithPropertyList:resumeDictionary format:NSPropertyListXMLFormat_v1_0 options:0 error:nil];
  40. }
  41. - (NSMutableDictionary *)getResumeDictionaryWithData:(NSData *)data
  42. {
  43. return [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:nil error:nil];
  44. }
  45. - (NSData *)getCorrectRequestDataWithData:(NSData *)data
  46. {
  47. if (!data) return nil;
  48. if ([NSKeyedUnarchiver unarchiveObjectWithData:data]) return data;
  49. NSMutableDictionary *archive = [[NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:nil error:nil] mutableCopy];
  50. if (!archive) return nil;
  51. NSInteger i = 0;
  52. id objectss = archive[@"$objects"];
  53. while ([objectss[1] objectForKey:[NSString stringWithFormat:@"$%ld", i]]) {
  54. i++;
  55. }
  56. NSInteger j = 0;
  57. while ([archive[@"$objects"][1] objectForKey:[NSString stringWithFormat:@"__nsurlrequest_proto_prop_obj_%ld", j]]) {
  58. NSMutableArray *array = archive[@"$objects"];
  59. NSMutableDictionary *dic = array[1];
  60. id obj = [dic objectForKey:[NSString stringWithFormat:@"__nsurlrequest_proto_prop_obj_%ld", j]];
  61. if (obj) {
  62. [dic setValue:obj forKey:[NSString stringWithFormat:@"$%ld", i + j]];
  63. [dic removeObjectForKey:[NSString stringWithFormat:@"__nsurlrequest_proto_prop_obj_%ld", j]];
  64. [array replaceObjectAtIndex:1 withObject:dic];
  65. archive[@"$objects"] = array;
  66. }
  67. j++;
  68. }
  69. if ([archive[@"$objects"][1] objectForKey:@"__nsurlrequest_proto_props"]) {
  70. NSMutableArray *array = archive[@"$objects"];
  71. NSMutableDictionary *dic = array[1];
  72. id obj = [dic objectForKey:@"__nsurlrequest_proto_props"];
  73. if (obj) {
  74. [dic setValue:obj forKey:[NSString stringWithFormat:@"$%ld", i + j]];
  75. [dic removeObjectForKey:@"__nsurlrequest_proto_props"];
  76. [array replaceObjectAtIndex:1 withObject:dic];
  77. archive[@"$objects"] = array;
  78. }
  79. }
  80. if ([archive[@"$top"] objectForKey:@"NSKeyedArchiveRootObjectKey"]) {
  81. [archive[@"$top"] setObject:archive[@"$top"][@"NSKeyedArchiveRootObjectKey"] forKey: NSKeyedArchiveRootObjectKey];
  82. [archive[@"$top"] removeObjectForKey:@"NSKeyedArchiveRootObjectKey"];
  83. }
  84. return [NSPropertyListSerialization dataWithPropertyList:archive format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil];
  85. }
  86. @end