Selaa lähdekoodia

Fix NSURLSession and NSURLSessionTask swizzling on iOS 7

Ryan Olson 11 vuotta sitten
vanhempi
commit
9d98993838
1 muutettua tiedostoa jossa 18 lisäystä ja 0 poistoa
  1. 18 0
      Classes/Network/PonyDebugger/FLEXNetworkObserver.m

+ 18 - 0
Classes/Network/PonyDebugger/FLEXNetworkObserver.m

@@ -342,6 +342,12 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
     Class class = [NSURLSessionTask class];
     Class class = [NSURLSessionTask class];
     SEL selector = @selector(resume);
     SEL selector = @selector(resume);
     SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
     SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
+
+    if ([self instanceRespondsButDoesNotImplementSelector:selector class:class]) {
+        // Dummy NSURLSessionTask to get the actual class, needed for iOS 7 (__NSCFURLSessionTask)
+        class = [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"about:blank"]] superclass];
+    }
+
     Method originalResume = class_getInstanceMethod(class, selector);
     Method originalResume = class_getInstanceMethod(class, selector);
 
 
     void (^swizzleBlock)(NSURLSessionTask *) = ^(NSURLSessionTask *slf) {
     void (^swizzleBlock)(NSURLSessionTask *) = ^(NSURLSessionTask *slf) {
@@ -441,6 +447,12 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
         SEL selector = selectors[selectorIndex];
         SEL selector = selectors[selectorIndex];
         SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
         SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
 
 
+        if ([self instanceRespondsButDoesNotImplementSelector:selector class:class]) {
+            // iOS 7 does not implement these methods on NSURLSession. We actually want to
+            // swizzle __NSCFURLSession, which we can get from the class of the shared session
+            class = [[NSURLSession sharedSession] class];
+        }
+
         NSURLSessionTask *(^asyncDataOrDownloadSwizzleBlock)(Class, id, NSURLSessionAsyncCompletion) = ^NSURLSessionTask *(Class slf, id argument, NSURLSessionAsyncCompletion completion) {
         NSURLSessionTask *(^asyncDataOrDownloadSwizzleBlock)(Class, id, NSURLSessionAsyncCompletion) = ^NSURLSessionTask *(Class slf, id argument, NSURLSessionAsyncCompletion completion) {
             NSString *requestID = [self nextRequestID];
             NSString *requestID = [self nextRequestID];
             NSString *mechanism = [self mechansimFromClassMethod:selector onClass:class];
             NSString *mechanism = [self mechansimFromClassMethod:selector onClass:class];
@@ -471,6 +483,12 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
         SEL selector = selectors[selectorIndex];
         SEL selector = selectors[selectorIndex];
         SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
         SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
 
 
+        if ([self instanceRespondsButDoesNotImplementSelector:selector class:class]) {
+            // iOS 7 does not implement these methods on NSURLSession. We actually want to
+            // swizzle __NSCFURLSession, which we can get from the class of the shared session
+            class = [[NSURLSession sharedSession] class];
+        }
+
         NSURLSessionUploadTask *(^asyncUploadTaskSwizzleBlock)(Class, NSURLRequest *, id, NSURLSessionAsyncCompletion) = ^NSURLSessionUploadTask *(Class slf, NSURLRequest *request, id argument, NSURLSessionAsyncCompletion completion) {
         NSURLSessionUploadTask *(^asyncUploadTaskSwizzleBlock)(Class, NSURLRequest *, id, NSURLSessionAsyncCompletion) = ^NSURLSessionUploadTask *(Class slf, NSURLRequest *request, id argument, NSURLSessionAsyncCompletion completion) {
             NSString *requestID = [self nextRequestID];
             NSString *requestID = [self nextRequestID];
             NSString *mechanism = [self mechansimFromClassMethod:selector onClass:class];
             NSString *mechanism = [self mechansimFromClassMethod:selector onClass:class];