我有业务需要能够为嵌入式UIWebView自定义UserAgent。 (例如,如果用户使用的是应用程序的一个版本而不是另一个版本,我希望服务器以不同的方式做出响应。)
是否可以在现有UIWebView控件中自定义UserAgent,例如,对于Windows应用程序中的嵌入式IE浏览器?
答案 0 :(得分:92)
以下是StackOverflow用户PassKit和Kheldar对Swift 3+项目的建议:
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
来源:https://stackoverflow.com/a/27330998/128579
对于iOS 5更改,我建议采用以下方法,最初来自此StackOverflow问题:UIWebView iOS5 changing user-agent,如下面的答案中所述。在该页面的评论中,它似乎也适用于4.3及更早版本。
通过运行此代码一次更改“UserAgent”默认值 你的应用开始了:
NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"}; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize];
如果您需要在4.3 / 5.0之前的iOS版本中运行的方法,请参阅此帖子的先前编辑。请注意,由于广泛的编辑,此页面上的以下评论/其他答案可能没有意义。毕竟,这是一个四年之久的问题。 ; - )
答案 1 :(得分:19)
我也有这个问题,并尝试了所有方法。我发现只有这种方法有效(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仍然使用用户代理值来自用户默认值,无论您尝试在NSHttpRequest中设置什么。
答案 2 :(得分:18)
它应该与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];
答案 3 :(得分:10)
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])
注意:您可能需要卸载并重新安装应用程序,以避免附加到现有代理字符串。
答案 4 :(得分:6)
把这一切都解决了我的解决方法:
- (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];
}
谢谢大家。
答案 5 :(得分:6)
使用@“User_Agent”只会导致自定义标题出现在GET请求中。
User_agent:Foobar / 1.0 \ r \ n用户代理:Mozilla / 5.0(iPhone; U; CPU) iPhone OS 3_1_2与Mac OS X一样; en-us)AppleWebKit / 528.18(KHTML,喜欢 Gecko)Mobile / 7D11 \ r \ n
以上是解剖的HTTP数据包中出现的内容,基本上证实了Sfjava从该论坛引用的内容。有趣的是,“User-Agent”变成了“User_agent”。
答案 6 :(得分:6)
实际上在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。
答案 7 :(得分:5)
通过汇集the answer by Louis St-Amour和NSUserDefaults+UnRegisterDefaults
类别from this question/answer,您可以在应用运行时随时使用以下方法启动和停止用户代理欺骗:
#define kUserAgentKey @"UserAgent"
- (void)startSpoofingUserAgent:(NSString *)userAgent {
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}
- (void)stopSpoofingUserAgent {
[[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
答案 8 :(得分:4)
这个解决方案似乎被认为是一种非常聪明的方法
changing-the-headers-for-uiwebkit-http-requests
它使用Method Swizzling,您可以在CocoaDev page
上了解有关它的更多信息试一试!
答案 9 :(得分:2)
我遇到了同样的问题。我想向用户代理添加一些信息,还需要保留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之前使用它。
答案 10 :(得分:1)
在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];
}
答案 11 :(得分:1)
我发现的唯一问题是仅更改用户代理
- (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];
}
答案 12 :(得分:0)
要将自定义内容添加到当前UserAgent值,请执行以下操作:
1 - 从新的WEBVIEW获取用户代理值
2 - 将自定义内容附加到其中
3 - 使用关键UserAgent
将新值保存在字典中4 - 将字典保存在standardUserDefaults中。
见下面的例子:
{{1}}
答案 13 :(得分:0)
Apple很快将停止接受带有UIWebView的应用程序。在下面找到有关如何在WKWebView中更改用户代理的方法。
let config = WKWebViewConfiguration()
config.applicationNameForUserAgent = "My iOS app"
webView = WKWebView(frame: <the frame you need>, configuration: config)