我有一个业务需求,需要能够自定义嵌入式UIWebView的UserAgent。(例如,如果用户使用应用程序的某个版本与另一个版本不同时,我希望服务器有不同的响应。)
是否可以像Windows应用程序中的嵌入式IE浏览器一样,以现有的UIWebView控件的方式自定义UserAgent呢?
我有一个业务需求,需要能够自定义嵌入式UIWebView的UserAgent。(例如,如果用户使用应用程序的某个版本与另一个版本不同时,我希望服务器有不同的响应。)
是否可以像Windows应用程序中的嵌入式IE浏览器一样,以现有的UIWebView控件的方式自定义UserAgent呢?
以下是来自StackOverflow用户PassKit和Kheldar的关于Swift 3+项目的建议:
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
来源: https://dev59.com/LHRB5IYBdhLWcg3w4bKv#27330998
随着iOS 5的变化,我建议采用以下方法,最初来自这个StackOverflow问题:UIWebView iOS5 changing user-agent,如下面的一个答案所指出。在该页面的评论中,它似乎也适用于4.3和更早版本。
Change the "UserAgent" default value by running this code once when your app starts:
NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"}; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize];
如果您需要适用于iOS 4.3/5.0之前版本的方法,请查看此帖子的先前编辑。请注意,由于进行了广泛的编辑,此页面上的以下评论/其他答案可能没有意义。毕竟,这是一个四年前的问题。;-)
我也遇到了这个问题,并尝试了所有方法。我发现只有这种方法有效(iOS 5.x):UIWebView iOS5 changing user-agent
原理是在用户设置中永久设置用户代理。这行得通;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仍然使用用户默认值中的user agent值,无论你在NSHttpRequest中尝试设置什么。
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"UserAgent": @"custom agent" }];
- Yariv Nissim如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])
注意:您可能需要卸载并重新安装该应用程序,以避免将信息添加到现有的代理字符串中。根据我的解决方案,所有问题都已得到解决:
- (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.
实际上,在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 标头,因为它被苹果覆盖了。我想如果要覆盖它,你将不得不自己管理 NSURLConnection。
通过汇总Louis St-Amour的答案和这个问题/答案中的NSUserDefaults+UnRegisterDefaults
类别,您可以使用以下方法在应用程序运行时随时启动和停止用户代理欺骗:
#define kUserAgentKey @"UserAgent"
- (void)startSpoofingUserAgent:(NSString *)userAgent {
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}
- (void)stopSpoofingUserAgent {
[[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
unregisterDefaultForKey:
在这里实现:https://dev59.com/VlDTa4cB1Zd3GeqPIVzb#18109860(如答案中所述)。 - EthanB我曾经遇到过同样的问题。我想要向用户代理中添加一些信息,同时需要保留webview的原始用户代理。我通过使用以下代码来解决这个问题:
//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];
在实例化Webview之前使用。
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
? 基本上我已经尝试过了,但没有成功。只是想知道是否可能,因为您建议在启动时最初执行此操作。 - Pedroinpeace