2010-03-22 6 views
2

J'ai une application de navigateur de bureau qui utilise un WebView pour héberger un plugin Flash. Le plugin Flash envoie régulièrement des requêtes à un site externe pour de nouvelles données, qu'il dessine ensuite sous la forme de graphiques fantaisistes. Je souhaite intercepter ces requêtes Web et obtenir les données (pour pouvoir les afficher via Growl, au lieu de conserver une fenêtre de bureau). Mais le mieux que je puisse dire, les demandes faites par Flash ne sont pas récupérées par les délégués WebView normaux.Intercepter les requêtes Web à partir d'un plugin WebView Flash

Y at-il un autre endroit où je peux placer un crochet? J'ai essayé d'installer un NSURLCache personnalisé via [NSURLCache setSharedURLCache] mais cela n'a jamais été appelé. J'ai aussi essayé la méthode en faisant tourner quelques-unes des autres classes (comme NSCachedURLResponse) mais je n'ai pas trouvé de solution. Des idées? Merci beaucoup!

Répondre

3

Surpris personne n'a répondu à cela, c'est en fait assez facile. Créez une sous-classe de NSURLProtocol, puis appelez registerClass pour commencer l'interception.

[NSURLProtocol registerClass:[MyCustomURLProtocol class]]; 

Voici les bits importants de la sous-classe:

#define REQUEST_HEADER_TAG @"x-mycustomurl-intercept" 

+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest 
{ 
    // Check for the custom header on the request to break the 
    // infinite loop created by the [startLoading] below. 
    if ([theRequest valueForHTTPHeaderField:REQUEST_HEADER_TAG]) { 
     return NO; 
    } 

    if ([theRequest.URL.scheme caseInsensitiveCompare:@"http"] == NSOrderedSame) { 
     return YES; 
    } 
    return NO; 
} 

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

- (id)initWithRequest:(NSURLRequest*)theRequest 
     cachedResponse:(NSCachedURLResponse*)cachedResponse 
       client:(id<NSURLProtocolClient>)client 
{ 
    // Add a custom header on the request to break the 
    // infinite loop created by the [startLoading] below. 
    NSMutableURLRequest* newRequest = [theRequest mutableCopy]; 
    [newRequest setValue:@"" forHTTPHeaderField:REQUEST_HEADER_TAG]; 

    // Now continue the process with this "tagged" request 
    self = [super initWithRequest:theRequest 
        cachedResponse:cachedResponse 
          client:client]; 
    if (self) { 
     // capture the data received 
     [self setRequest:newRequest]; 
     receivedData = [[NSMutableData data] retain]; 
    } 

    [newRequest release]; 
    return self; 
} 

- (void)dealloc 
{ 
    [connection release]; 
    [request release]; 
    [receivedData release]; 
    [super dealloc]; 
} 


- (void)startLoading 
{ 
    // Load the data off the web as usual, but set myself up as the delegate 
    // so I can intercept the response data as it comes in. 
    [self setConnection:[NSURLConnection connectionWithRequest:request delegate:self]]; 
} 


- (void)stopLoading 
{ 
    [connection cancel]; 
} 

#pragma mark NSURLConnection delegate implementation 

- (void)connection:(NSURLConnection*)conn 
        didReceiveResponse:(NSURLResponse*)response 
{ 
    [[self client] URLProtocol:self 
      didReceiveResponse:response 
      cacheStoragePolicy:[request cachePolicy]]; 
    [receivedData setLength:0]; 
} 


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


- (void)connectionDidFinishLoading:(NSURLConnection*)conn 
{ 
    [[self client] URLProtocolDidFinishLoading:self]; 
    [self setConnection:nil]; 
    if (requestTag != 0) { 
     if (requestDelegate && 
      [requestDelegate respondsToSelector: 
       @selector(finishedLoadingData:forURL:taggedWith:)]) { 
      [requestDelegate finishedLoadingData:receivedData 
              forURL:[request URL] 
             taggedWith:requestTag]; 
     } 
    } 
} 


- (void)connection:(NSURLConnection*)conn didFailWithError:(NSError*)error 
{ 
    [[self client] URLProtocol:self didFailWithError:error]; 
    [self setConnection:nil]; 
} 
+0

Pour votre information, j'ai une réponse améliorée ici: http://stackoverflow.com/questions/3155359/webkit-how- do-i-get-le-contenu-de-la-ressource – starkos

Questions connexes