web-dev-qa-db-fra.com

UIWebView iOS5 changeant d'agent utilisateur

Comment puis-je changer l'agent utilisateur d'UIWebView dans iOS 5?

Ce que j'ai fait jusqu'à présent: En utilisant le rappel du délégué, interceptez la NSURLRequest, créez une nouvelle demande d'URL et définissez son user-agent comme je veux, puis téléchargez les données et rechargez 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é, quel stagiaire appelle le délégué ....

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

- (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;
}
36
0xSina

Modifiez la valeur par défaut "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é cela avec beaucoup de succès, mais je veux 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 le faire imprimer pour vous: WhatsMyAgent . De même, vous pouvez vous connecter en utilisant n'importe quel type d'appareil mobile, et l'obtenir de cette façon aussi. BTW cela fonctionne toujours très bien dans iOS7 +

89
Martin Wickman

Dans Swift utilisez ceci pour définir serAgent,

func setUserAgent(){

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

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

}

Utilisez-le pour tester,

println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));
1
Zaid Pathan

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

alors aWebView shouldStartLoadWithRequest: sera appelé à nouveau, puis à nouveau - c'est pourquoi vous obtenez une récursion infinie

Vous devez restreindre l'appel de votre bloc 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;
}
0
funberry