Cambiar el agente de usuario en UIWebView (iPhone SDK)

Tengo una necesidad comercial para poder personalizar el UserAgent para un UIWebView incrustado. (Por ejemplo, me gustaría que el servidor responda de manera diferente si, por ejemplo, un usuario usa una versión de la aplicación frente a otra).

¿Es posible personalizar el UserAgent en el control UIWebView del iPhone SDK existente de la misma manera que, por ejemplo, para un navegador IE incorporado en una aplicación de Windows?

Con los cambios de iOS 5, recomiendo el siguiente enfoque, originalmente a partir de esta pregunta de StackOverflow: UIWebView iOS5 cambiando el agente de usuario como se señala en la respuesta a continuación. En los comentarios en esa página, parece funcionar en 4.3 y anteriormente también.

Cambie el valor predeterminado de “UserAgent” ejecutando este código una vez cuando se inicie la aplicación:

NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"}; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize]; 

Consulte ediciones anteriores en esta publicación si necesita métodos que funcionen en las versiones de iOS anteriores a 4.3 / 5.0. Tenga en cuenta que debido a las ediciones extensas, los siguientes comentarios / otras respuestas en esta página pueden no tener sentido. Esta es una pregunta de cuatro años, después de todo. 😉

También tuve este problema e intenté con todos los métodos. Descubrí que solo funciona este método (iOS 5.x): UIWebView iOS5 cambia el usuario-agente

El principio es establecer el agente de usuario permanentemente en la configuración del usuario. Esto funciona; Webview envía el encabezado dado. Solo dos líneas de código:

 NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

Configurando User-Agent, o User_Agent en la solicitud mutable, o reemplazando el setValue en NSHttpRequest por swizzling, – Intenté todo eso y controlé los resultados con wireshark, y nada de eso parece funcionar, porque Webview todavía usa el valor del agente de usuario desde los valores predeterminados del usuario, sin importar lo que intente establecer en NSHttpRequest.

Debería funcionar con una NSMutableURLRequest como ha escrito Kuso.

 NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]]; [urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value. 

Tendrá que usar NSURLConnection para obtener responseData. Establezca ResponseData en su UIWebView y webView debería representar:

 [webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL]; 

Muy simple en Swift. Simplemente coloque lo siguiente en su delegado de la aplicación.

 UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"]) 

Si desea agregar a la cadena de agente existente, entonces:

 let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent" UserDefaults.standard.register(defaults: ["UserAgent" : userAgent]) 

Nota: Es posible que deba desinstalar y volver a instalar la aplicación para evitar agregarla a la cadena del agente existente.

En realidad, agregar cualquier campo de encabezado al argumento NSURLRequest en shouldStartLoadWithRequest parece funcionar, porque la solicitud responde a setValue: ForHTTPHeaderField, pero en realidad no funciona, la solicitud se envía sin el encabezado.

Así que utilicé esta solución en shouldStartLoadWithRequest que simplemente copia la solicitud dada a una nueva solicitud mutable y la vuelve a cargar. De hecho, esto modifica el encabezado que se envía.

 if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil ) { NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL]; [modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"]; [webViewArgument loadRequest:modRequest]; return NO; } 

Desafortunadamente, esto aún no permite anular el encabezado http del agente de usuario, que aparentemente es sobreescrito por Apple. Supongo que para anularlo tendrías que administrar un NSURLConnection por ti mismo.

Usar @ “User_Agent” simplemente hace que aparezca un encabezado personalizado en la solicitud GET.

User_agent: Foobar / 1.0 \ r \ n
User-Agent: Mozilla / 5.0 (iPhone; U; CPU iPhone OS 3_1_2 como Mac OS X; en-us) AppleWebKit / 528.18 (KHTML, como Gecko) Móvil / 7D11 \ r \ n

Lo anterior es lo que aparece en el paquete HTTP diseccionado, esencialmente confirmando lo que Sfjava estaba citando de ese foro. Es interesante observar que “User-Agent” se convierte en “User_agent”.

Tomando todo esto es cómo se resolvió para mí:

 - (void)viewDidLoad { NSURL *url = [NSURL URLWithString: @"http://www.amazon.com"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setValue:@"Foobar/1.0" forHTTPHeaderField:@"User-Agent"]; [webView loadRequest:request]; } 

Gracias a todos.

Esta solución parece haber sido vista como una forma muy inteligente de hacerlo

cambiar-los-encabezados-por-uiwebkit-http-requests

Utiliza Method Swizzling y puede obtener más información al respecto en la página CocoaDev

¡Dale un vistazo!

Al agrupar la respuesta de Louis St-Amour y la categoría NSUserDefaults+UnRegisterDefaults de esta pregunta / respuesta , puede usar los siguientes métodos para iniciar y detener el spoofing del agente de usuario en cualquier momento mientras se ejecuta su aplicación:

 #define kUserAgentKey @"UserAgent" - (void)startSpoofingUserAgent:(NSString *)userAgent { [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }]; } - (void)stopSpoofingUserAgent { [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey]; } 

Enfrenté la misma pregunta. Quiero agregar algo de información al usuario-agente, también necesito mantener el usuario-agente original de la vista web. Lo resolví usando el siguiente código:

  //get the original user-agent of webview UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; NSLog(@"old agent :%@", oldAgent); //add my info to the new agent NSString *newAgent = [oldAgent stringByAppendingString:@" Jiecao/2.4.7 ch_appstore"]; NSLog(@"new agent :%@", newAgent); //regist the new agent NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary]; 

Úselo antes de instaurar la vista web.

Prueba esto en AppDelegate.m

 + (void)initialize { // Set user agent (the only problem is that we can't modify the User-Agent later in the program) // iOS 5.1 NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@”Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3”, @”UserAgent”, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary]; } 

El único problema que he encontrado fue cambiar agente de usuario solamente

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: @"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; } 

Para agregar un contenido personalizado al valor actual del agente de usuario, haga lo siguiente:

1 – Obtener el valor de agente de usuario de una NUEVA WEBVIEW

2 – Agregue el contenido personalizado a él

3 – Guarde el nuevo valor en un diccionario con la clave UserAgent

4 – Guarde el diccionario en standardUserDefaults.

Vea el siguiente ejemplo:

 NSString *userAgentP1 = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; NSString *userAgentP2 = @"My_custom_value"; NSString *userAgent = [NSString stringWithFormat:@"%@ %@", userAgentP1, userAgentP2]; NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:userAgent, @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];