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;
}
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 +
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"));
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;
}