2010-07-29 3 views
4

Mon application utilise sous-classe de NSURLProtocol. Il y a plusieurs UIWebViews dans l'application et pour un algorithme spécifique implémenté dans NSURLProtocol, j'ai besoin de savoir lequel des UIWebViews envoie la requête.Comment faire pour obtenir la demande UIWebView à partir de NSURLProtocol

Ma compréhension est que l'objet retourné par [self client] devrait être quelque peu lié à l'objet demandeur. Mais ni NSURLProtocolClient (c'est-à-dire le protocole implémenté par l'objet renvoyé par [self client]) ni l'objet sous-jacent _NSCFURLProtocolBridge n'ont de propriétés/méthodes pour obtenir l'expéditeur de la requête.

Quelqu'un peut-il m'aider avec des idées?

Répondre

-1

Idéalement, vous ne devriez pas avoir à référencer UIWebView directement à partir du NSURLProtocol. Cependant, j'ai eu besoin dans le passé d'avoir un NSURLProtocol envoyer des messages à UIWebView qui sont en dehors des messages de délégué habituels ... utiliser NSNotificationCenter, je poste des notifications en utilisant l'objet NSURLRequest comme objet, et je m'abonne à ces notifications auditeur.

0

dans loadRequest:

static NSString* [email protected]"urAPP_ProtocolClient"; 

    NSMutableURLRequest* Request=[request mutableCopy]; 
    [Request setValue:[NSString stringWithFormat:@"someID",self.someID] forHTTPHeaderField:ProtocolClient]; 

dans le protocole:

NSString* header=[_currentRequest valueForHTTPHeaderField:ProtocolClient]; 

if (header) { 
+0

Je peux certainement distinguer les demandes que je crée explicitement. La question portait sur les demandes de ressources référencées (comme les images, les fichiers de script, etc.) qu'UIWebView envoie lui-même. Merci quand même. – okonov

3

NSURLRequest a une méthode appelée mainDocumentURL qui renvoie l'URL du document racine. Vous pouvez éventuellement sauver que loin dans la méthode UIWebViewDelegate comme celui-ci,

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if([[request.URL absoluteString] isEqualToString:[request.mainDocumentURL absoluteString]]) 
    { 
     // associate this URL with this UIWebview 
    } 
} 

Vous pouvez alors regarder le mainDocumentURL dans vos méthodes NSURLProtocol pour identifier le UIWebView. Ce n'est pas une preuve infaillible, car il ne tient pas compte des cas où plusieurs UIWebViews charger la même URL. Mais c'est la meilleure solution à laquelle je puisse penser.

1

Voir https://stackoverflow.com/a/19700910/502149. Pour résumer, vous pouvez définir l'agent utilisateur pour chaque UIWebView avant de le créer en utilisant les valeurs par défaut de l'utilisateur. Comme la vue ne prend pas en compte les modifications ultérieures de l'agent utilisateur, vous obtenez un agent utilisateur différent dans chaque UIWebView. Vous pouvez l'utiliser dans NSURLProtcol pour identifier la vue, et vous pouvez transmettre l'agent UA réel pour que le serveur ne voit aucune différence.

Notez que pour que le UIWebView mémorise le paramètre de chaîne UA, il doit effectuer au moins une requête avant de modifier le paramètre.

0
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

La requête est de type mutable. Vous pouvez donc utiliser
+[NSURLProtocol setProperty:forKey:inRequest:] pour définir la propriété personnalisée. Et +[NSURLProtocol propertyForKey:inRequest] de l'intérieur de NSURLProtocol

Questions connexes