UIWebView iOS5 cambia el usuario-agente

¿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 +

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

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; }