27 votes

UIWebView iOS5 changement d'agent utilisateur

Comment changer l'agent utilisateur de UIWebView dans iOS 5 ?

Ce que j'ai fait jusqu'à présent : En utilisant le rappel du délégué, intercepter la NSURLRequest, créer une nouvelle requête url et définir son agent utilisateur comme je le souhaite, puis télécharger les données et recharger l'UIWebView avec "loadData:MIMEType :....".

Problème : Cela provoque une récursion infinie, où je charge les données, qui rappelle le délégué, qui rappelle en interne le délégué.....

Voici la méthode du délégué :

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

    dispatch_async(kBgQueue, ^{
        NSURLResponse *response = nil;
        NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[request URL]];
        NSDictionary *headers = [NSDictionary dictionaryWithObject:
                                 @"custom_test_agent" forKey:@"User-Agent"];
        [newRequest setAllHTTPHeaderFields:headers];
        [self setCurrentReqest:newRequest];
        NSData *data = [NSURLConnection sendSynchronousRequest:newRequest 
                                             returningResponse:&response 
                                                         error:nil];
        dispatch_sync(dispatch_get_main_queue(), ^{
            [webView loadData:data 
                     MIMEType:[response MIMEType] 
             textEncodingName:[response textEncodingName] 
                      baseURL:[request URL]];
        });
    });

    return YES;
}

79voto

Martin Wickman Points 9628

Changez la valeur par défaut de "UserAgent" en exécutant ce code une fois au démarrage de votre application :

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Your user agent", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];  

EDIT : J'ai utilisé cette méthode avec beaucoup de succès, mais je souhaite ajouter des détails supplémentaires. Pour obtenir un agent utilisateur, vous pouvez activer le menu "Développeur", définir l'agent utilisateur, puis vous connecter à ce site pour qu'il soit imprimé pour vous : WhatsMyAgent . De même, vous pouvez vous connecter à l'aide de n'importe quel type d'appareil mobile et l'obtenir de cette façon également. BTW, cela fonctionne toujours très bien sous iOS7+.

1voto

Zaid Khan Points 15

En Swift utiliser pour définir UserAgent ,

func setUserAgent(){

    var userAgent = NSDictionary(objectsAndKeys:  "YourUserAgentName","UserAgent")

    NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])

}

Utilisez ceci pour tester,

println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));

0voto

funberry Points 1

Lorsque vous envoyez un message [aWebView loadData:MIMEType:textEncodingName:baseURL:]

puis aWebView shouldStartLoadWithRequest: sera appelé encore, et encore - c'est pourquoi vous obtenez une récursion infinie

Vous devez limiter l'appel de votre dispatch_async() par exemple en utilisant une URL conventionnelle :

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

    if ([[[request URL] absoluteString] isEqualToString:@"http://yourdomain.com/?local=true"]) {
        return YES;
    }

    ...

    dispatch_async(...
            [aWebView loadData:data 
                      MIMEType:[response MIMEType] 
              textEncodingName:[response textEncodingName] 
                       baseURL:[NSURL URLWithString:@"http://yourdomain.com/?local=true"]];

    );
    return NO;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X