我有一项业务需要能够为嵌入式UIWebView定制UserAgent。(例如,如果用户使用的是应用的一个版本,而另一个版本,则我希望服务器做出不同的响应。)
是否可以像在Windows应用程序中的嵌入式IE浏览器那样自定义现有UIWebView控件中的UserAgent?
Answers:
这是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版本中可用的方法,请参见此文章的先前编辑内容。请注意,由于进行了大量的编辑,因此此页面上的以下注释/其他答案可能没有意义。毕竟,这是一个有四年历史的问题。;-)
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
吗?基本上我已经尝试过了,但是没有解决。只想知道是否有可能,因为您建议在启动时首先这样做。
我也遇到了这个问题,并尝试了所有方法。我发现只有此方法有效(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,或通过摇晃来覆盖NSHttpRequest中的setValue,-我尝试了所有操作并使用Wireshark控制了结果,但这些似乎都不起作用,因为Webview仍使用用户代理值从用户默认值开始,无论您尝试在NSHttpRequest中设置什么。
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"UserAgent": @"custom agent" }];
正如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中非常简单。只需将以下内容放入您的应用程序委托中即可。
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
如果要追加到现有代理字符串,则:
let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])
注意:您可能需要卸载并重新安装该应用程序,以避免附加到现有代理字符串中。
其实添加任何头字段中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。
使用@“ User_Agent”只会使自定义标头出现在GET请求中。
User_agent:Foobar / 1.0 \ r \ n
用户代理:Mozilla / 5.0(iPhone; U; CPU iPhone OS 3_1_2,如Mac OS X; zh-CN)AppleWebKit / 528.18(KHTML,如Gecko)Mobile / 7D11 \ r \ n
以上是剖析后的HTTP数据包中显示的内容,实质上证实了Sfjava在该论坛中引用的内容。有趣的是,“ User-Agent”变成了“ User_agent”。
通过汇总Louis St-Amour的答案和该问题/答案的NSUserDefaults+UnRegisterDefaults
类别,您可以在应用运行时随时使用以下方法来启动和停止用户代理欺骗:
#define kUserAgentKey @"UserAgent"
- (void)startSpoofingUserAgent:(NSString *)userAgent {
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}
- (void)stopSpoofingUserAgent {
[[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
unregisterDefaultForKey:
在此处实现:stackoverflow.com/a/18109860/1580288(如答案中所述)。
我遇到了同样的问题。我想向用户代理添加一些信息,还需要保留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之前使用它。
在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];
}
我发现的唯一问题是仅更改用户代理
- (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];
}
要将定制内容仅添加到当前UserAgent值,请执行以下操作:
1-从新的WEBVIEW获取用户代理值
2-向其添加自定义内容
3-使用键UserAgent将新值保存在字典中
4-将字典保存在standardUserDefaults中。
参见以下示例:
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];