objective c - que - UIWebView iOS5 cambia el usuario-agente
wkwebview ios (3)
¿Cómo puedo cambiar el agente de usuario de UIWebView en iOS 5?
Lo que he hecho hasta ahora: usar la llamada de delegado, interceptar NSURLRequest, crear una nueva solicitud de URL y configurar su user-agent como lo que yo quiera, luego descargar los datos y volver a cargar UIWebView con "loadData: MIMEType: ... . ".
Problema: Esto causa recursión infinita, donde cargo los datos, lo que llama al delegado de nuevo, que el interno llama al delegado ...
Aquí está el método delegado:
- (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;
}
Cambie el valor predeterminado de "UserAgent" ejecutando este código una vez cuando se inicie la aplicación:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Your user agent", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
EDITAR: Lo he usado con gran éxito, pero quiero agregar detalles adicionales. Para obtener un agente de usuario, puede habilitar el menú "Desarrollador", configurar el agente de usuario y luego conectarse a este sitio para imprimirlo: WhatsMyAgent . Del mismo modo, puede conectarse utilizando cualquier tipo de dispositivo móvil y obtenerlo también. Por cierto, esto sigue funcionando bien en iOS7 +
Cuando envía el mensaje [aWebView loadData:MIMEType:textEncodingName:baseURL:]
luego aWebView shouldStartLoadWithRequest:
volverá a llamar, y luego otra vez - es por eso que obtienes una recursión infinita
Debes restringir la llamada a tu bloque dispatch_async()
, por ejemplo, usando alguna URL convencional:
- (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;
}
En Swift, use esto para establecer UserAgent ,
func setUserAgent(){
var userAgent = NSDictionary(objectsAndKeys: "YourUserAgentName","UserAgent")
NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])
}
Use esto para probar,
println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));