我有业务需要能够为嵌入式UIWebView自定义UserAgent.(例如,如果用户使用的是应用程序的一个版本而不是另一个版本,我希望服务器以不同的方式做出响应.)
是否可以在现有的UIWebView控件中自定义UserAgent,例如,对于Windows应用程序中的嵌入式IE浏览器?
以下是StackOverflow用户PassKit和Kheldar对Swift 3+项目的建议:
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
资料来源:https://stackoverflow.com/a/27330998/128579
随着iOS 5的更改,我推荐以下方法,最初来自这个StackOverflow问题:UIWebView iOS5更改用户代理,如下面的答案中所指出的.在该页面的评论中,它似乎也适用于4.3及更早版本.
在应用启动时运行此代码一次,更改"UserAgent"默认值:
NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"}; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize];
如果您需要在4.3/5.0之前的iOS版本中运行的方法,请参阅此帖子上的先前编辑.请注意,由于广泛的编辑,此页面上的以下评论/其他答案可能没有意义.毕竟,这是一个四年之久的问题.;-)
我也有这个问题,并尝试了所有方法.我发现只有这种方法有效(iOS 5.x): UIWebView iOS5更改用户代理
原则是在用户设置中永久设置用户代理.这有效; Webview发送给定的标头.只需两行代码:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
在可变请求中设置User-Agent或User_Agent,或者通过swizzling覆盖NSHttpRequest中的setValue, - 我尝试了所有这些并使用wireshark控制结果,但这些似乎都不起作用,因为Webview仍然使用用户代理值从用户默认值开始,无论您尝试在NSHttpRequest中设置什么.
它应该与Kuso编写的NSMutableURLRequest一起使用.
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]]; [urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value.
您必须使用NSURLConnection来获取responseData.将responseData设置为UIWebView,webView应呈现:
[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];
在Swift中非常简单.只需将以下内容放入App Delegate即可.
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
如果要附加到现有代理字符串,则:
let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent" UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])
注意:您可能需要卸载并重新安装应用程序以避免附加到现有代理字符串.
Taking everything this is how it was solved for me:
- (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]; }
Thanks Everyone.
使用@"User_Agent"只会导致自定义标题出现在GET请求中.
USER_AGENT:Foobar的/ 1.0\r \n
的User-Agent:Mozilla的/ 5.0(iPhone; U; CPU iPhone OS 3_1_2,例如Mac OS X; EN-US)为AppleWebKit/528.18(KHTML,例如Gecko)移动/ 7D11\r \n
以上是解剖的HTTP数据包中出现的内容,基本上证实了Sfjava从该论坛引用的内容.有趣的是,"User-Agent"变成了"User_agent".
其实添加任何头字段中shouldStartLoadWithRequest中的NSURLRequest说法 似乎工作,因为这个请求给setValue:ForHTTPHeaderField -但它并没有实际工作-请求无头发送出去.
所以我在shouldStartLoadWithRequest中使用了这个解决方法,它只是将给定的请求复制到一个新的可变请求,并重新加载它.这实际上修改了发送的标头.
if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil ) { NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL]; [modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"]; [webViewArgument loadRequest:modRequest]; return NO; }
不幸的是,这仍然不允许覆盖用户代理http标头,这显然被Apple覆盖.我想要覆盖它,你必须自己管理一个NSURLConnection.
通过汇集Louis St-Amour的答案以及此问题/答案中的NSUserDefaults+UnRegisterDefaults
类别,您可以在应用程序运行时随时使用以下方法启动和停止用户代理欺骗:
#define kUserAgentKey @"UserAgent" - (void)startSpoofingUserAgent:(NSString *)userAgent { [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }]; } - (void)stopSpoofingUserAgent { [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey]; }