Alterar o agente do usuário no UIWebView (iPhone SDK)

Eu tenho um negócio precisa ser capaz de personalizar o UserAgent para um UIWebView incorporado. (Por exemplo, gostaria que o servidor respondesse de maneira diferente se, digamos, um usuário estivesse usando uma versão do aplicativo em vez de outra.)

É possível personalizar o UserAgent no controle UIWebView do iPhone SDK existente do jeito que é, digamos, para um navegador IE incorporado em um aplicativo do Windows?

Eu também tive esse problema e tentei todos os methods. Descobri que apenas este método funciona (iOS 5.x): UIWebView iOS5 alterando user-agent

O princípio é definir o agente do usuário permanentemente nas configurações do usuário. Isso funciona; Webview envia o header dado. Apenas duas linhas de código:

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

Definindo User-Agent, ou User_Agent na requisição mutável, ou sobrescrevendo setValue no NSHttpRequest por swizzling, – Eu tentei tudo isso e controlei os resultados com wireshark, e nada disso parece funcionar, porque o Webview ainda usa o valor do agente user dos padrões do usuário, não importa o que você tente definir no NSHttpRequest.

Deve funcionar com um NSMutableURLRequest como Kuso escreveu.

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

Você terá que usar NSURLConnection para obter o responseData. Defina o responseData para o seu UIWebView e o webView deve renderizar:

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

Muito simples em Swift. Basta colocar o seguinte no seu Delegado de aplicativos.

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

Se você deseja append à sequência do agente existente, então:

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

Nota: Você pode precisar desinstalar e reinstalar o aplicativo para evitar append à cadeia do agente existente.

Na verdade, adicionar qualquer campo de header ao argumento NSURLRequest em shouldStartLoadWithRequest parece funcionar, porque a solicitação responde a setValue: ForHTTPHeaderField – mas na verdade não funciona – a solicitação é enviada sem o header.

Então, usei essa solução alternativa em shouldStartLoadWithRequest, que apenas copia a solicitação dada para uma nova solicitação mutável e a carrega novamente. Isso de fato modifica o header que é enviado.

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

Infelizmente, isso ainda não permite replace o header http do agente de usuário, que aparentemente é substituído pela Apple. Eu acho que, por passar por cima, você teria que gerenciar uma NSURLConnection sozinho.

Usar @ “User_Agent” simplesmente faz com que um header personalizado apareça na solicitação 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; pt-br) AppleWebKit / 528.18 (KHTML, como o Gecko) Mobile / 7D11 \ r \ n

O acima é o que aparece no pacote HTTP dissecado, essencialmente confirmando o que Sfjava estava citando daquele fórum. É interessante notar que o “User-Agent” é transformado em “User_agent”.

Tomando tudo isso é como foi resolvido para mim:

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

Obrigado a todos.

Esta solução parece ter sido vista como uma maneira muito inteligente de fazer isso

mudando-os-headers-para-uiwebkit-http-requests

Ele usa o método Swizzling e você pode aprender mais sobre ele na página do CocoaDev

Dê uma olhada!

Ao agrupar a resposta por Louis St-Amour e a categoria NSUserDefaults+UnRegisterDefaults desta pergunta / resposta , você pode usar os methods a seguir para iniciar e interromper o spoofing de agente do usuário a qualquer momento enquanto seu aplicativo estiver em execução:

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

Eu enfrentei a mesma pergunta. Eu quero adicionar algumas informações para o user-agent, também precisa manter o user agent original de webview. Eu resolvi usando o código abaixo:

  //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]; 

Use-o antes de você instanciar o webview.

Tente isso no 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]; } 

O único problema que encontrei foi alterar apenas o agente do usuário

 - (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 adicionar apenas um conteúdo personalizado ao valor atual do UserAgent, faça o seguinte:

1 – Obter o valor do agente do usuário de uma NOVA WEBVIEW

2 – Anexar o conteúdo personalizado a ele

3 – Salve o novo valor em um dictionary com a chave UserAgent

4 – Salve o dictionary em standardUserDefaults.

Veja o exemplo abaixo:

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