2016-02-25 1 views
0

Je tente de créer un protocole NSURLProtocol transparent pour les connexions http: // et https: // à l'aide de NSURLSession. Cependant, pour le moment, même si le gestionnaire d'achèvement est en cours d'exécution, les demandes d'URL avec l'application (UIWebView) reviennent vides. Est-ce que quelqu'un a des idées? Le code est ci-dessous:Utilisation de NSURLSession dans NSURLProtocol

#import "MyURLProtocol.h" 

// AppDelegate 
#import "AppDelegate.h" 

static NSString * const MyURLProtocolHandledKey = @"MyURLProtocolHandledKey"; 

@interface MyURLProtocol() <NSURLConnectionDelegate,NSURLSessionDelegate> 

@property (nonatomic, strong) NSURLConnection *connection; 
@property (nonatomic, strong) NSMutableData *mutableData; 
@property (nonatomic, strong) NSURLResponse *response; 

@end 

@implementation MyURLProtocol 

+(BOOL)canInitWithRequest:(NSURLRequest*)request 
{ 
    if ([NSURLProtocol propertyForKey:MyURLProtocolHandledKey inRequest:request]) 
     return NO; 
    NSString *scheme = request.URL.scheme.lowercaseString; 
    return [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]; 
} 

+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request { 
    return request; 
} 

-(void)startLoading 
{  
    NSMutableURLRequest *newRequest = [self.request mutableCopy]; 
    [NSURLProtocol setProperty:@YES forKey:@"MyURLProtocolHandledKey" inRequest:newRequest]; 

    NSURLRequest *request = newRequest; 

    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
              completionHandler: 
            ^(NSData *data, NSURLResponse *response, NSError *error) { 
             if (error != nil) { 
              NSLog(@"There was an error"); 
             } 
             NSLog(@"Completiio handler ran"); 
             self.mutableData = [NSMutableData dataWithData:data]; 
             self.response = response; 
            }]; 

    [task resume]; 
} 

- (void) stopLoading { 

    [self.connection cancel]; 
    self.mutableData = nil; 
} 

// Delegate stuff 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.client URLProtocol:self didLoadData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [self.client URLProtocolDidFinishLoading:self]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    [self.client URLProtocol:self didFailWithError:error]; 
} 

@end 

Répondre

1

Votre code est en utilisant NSURLConnection délégués pour transmettre des données à l'appelant, par exemple connectionDidFinishLoading:.

Pour résoudre ce problème:

  • remplacer par des méthodes NSURLSession de délégués.
  • Créez et conservez une session personnalisée dont le délégué est votre instance de classe de protocole; la session partagée n'a pas de délégué, elle n'appelle donc pas les méthodes déléguées de votre classe.
  • Supprimez le bloc de rappel afin que la méthode de délégation pour l'exécution de la requête soit appelée correctement.