|
35 | 35 | // On iOS 13+, this last method signature changes to: |
36 | 36 | //- (void)_didReceiveResponse:(id)arg1 sniff:(BOOL)arg2 rewrite:(BOOL)arg3; |
37 | 37 | // |
| 38 | +// On iOS 14+, the _task property loses all visibility, causing crashes when we call self.task, so we need to use |
| 39 | +// [valueForKey:@"_task"] instead of self.task. Since that code also works in iOS 13, rather than have three |
| 40 | +// swizzles (<13, 13 and >13), we kept it down to two. |
| 41 | +// |
38 | 42 | //@end |
39 | 43 |
|
40 | 44 | @interface __NSCFURLSessionConnection_Swizzles : NSObject |
@@ -80,39 +84,39 @@ - (void)PD__didFinishWithError:(NSError *)arg1; |
80 | 84 |
|
81 | 85 | @interface __NSCFURLSessionConnection_iOS13_Swizzles : NSObject |
82 | 86 |
|
83 | | -@property(copy) NSURLSessionTask *task; |
84 | | - |
85 | 87 | @end |
86 | 88 |
|
87 | 89 | @implementation __NSCFURLSessionConnection_iOS13_Swizzles |
88 | 90 |
|
89 | | -@dynamic task; |
90 | | - |
91 | 91 | - (void)PD__redirectRequest:(NSURLRequest *)arg1 redirectResponse:(NSURLResponse *)arg2 completion:(id)arg3; |
92 | 92 | { |
93 | | - [[PDNetworkDomainController defaultInstance] URLSession:[self.task valueForKey:@"session"] task:self.task willPerformHTTPRedirection:(id)arg2 newRequest:arg1]; |
94 | | - |
| 93 | + NSURLSessionTask *task = [self valueForKey:@"_task"]; |
| 94 | + [[PDNetworkDomainController defaultInstance] URLSession:[task valueForKey:@"session"] task:task willPerformHTTPRedirection:(id)arg2 newRequest:arg1]; |
| 95 | + |
95 | 96 | [self PD__redirectRequest:arg1 redirectResponse:arg2 completion:arg3]; |
96 | 97 | } |
97 | 98 |
|
98 | 99 | - (void)PD__didReceiveData:(id)arg1; |
99 | 100 | { |
100 | | - [[PDNetworkDomainController defaultInstance] URLSession:[self.task valueForKey:@"session"] dataTask:(id)self.task didReceiveData:arg1]; |
101 | | - |
| 101 | + NSURLSessionTask *task = [self valueForKey:@"_task"]; |
| 102 | + [[PDNetworkDomainController defaultInstance] URLSession:[task valueForKey:@"session"] dataTask:(id)task didReceiveData:arg1]; |
| 103 | + |
102 | 104 | [self PD__didReceiveData:arg1]; |
103 | 105 | } |
104 | 106 |
|
105 | 107 | - (void)PD__didReceiveResponse:(NSURLResponse *)response sniff:(BOOL)sniff rewrite:(BOOL)rewrite; |
106 | 108 | { |
| 109 | + NSURLSessionTask *task = [self valueForKey:@"_task"]; |
107 | 110 | // This can be called multiple times for the same request. Make sure it doesn't |
108 | | - [[PDNetworkDomainController defaultInstance] URLSession:[self.task valueForKey:@"session"] dataTask:(id)self.task didReceiveResponse:response]; |
| 111 | + [[PDNetworkDomainController defaultInstance] URLSession:[task valueForKey:@"session"] dataTask:(id)task didReceiveResponse:response]; |
109 | 112 |
|
110 | 113 | [self PD__didReceiveResponse:response sniff:sniff rewrite:rewrite]; |
111 | 114 | } |
112 | 115 |
|
113 | 116 | - (void)PD__didFinishWithError:(NSError *)arg1; |
114 | 117 | { |
115 | | - [[PDNetworkDomainController defaultInstance] URLSession:[self.task valueForKey:@"session"] task:self.task didCompleteWithError:arg1]; |
| 118 | + NSURLSessionTask *task = [self valueForKey:@"_task"]; |
| 119 | + [[PDNetworkDomainController defaultInstance] URLSession:[task valueForKey:@"session"] task:task didCompleteWithError:arg1]; |
116 | 120 | [self PD__didFinishWithError:arg1]; |
117 | 121 | } |
118 | 122 |
|
@@ -359,7 +363,7 @@ + (void)_swizzleNSURLSessionClasses; |
359 | 363 | BOOL success = class_addMethod(cfURLSessionConnectionClass, sourceMethod, originalImp, encoding); |
360 | 364 | NSAssert(success, @"Should be successful"); |
361 | 365 | IMP replacedImp = class_replaceMethod(cfURLSessionConnectionClass, originalMethod, sourceImp, encoding); |
362 | | - NSAssert(replacedImp, @"Expected originam method to have been replaced"); |
| 366 | + NSAssert(replacedImp, @"Expected original method to have been replaced"); |
363 | 367 | } |
364 | 368 |
|
365 | 369 | if (methods) { |
|
0 commit comments