在UIWebView中更改用户代理


70

我有一项业务需要能够为嵌入式UIWebView定制UserAgent。(例如,如果用户使用的是应用的一个版本,而另一个版本,则我希望服务器做出不同的响应。)

是否可以像在Windows应用程序中的嵌入式IE浏览器那样自定义现有UIWebView控件中的UserAgent?

Answers:


95

现代雨燕

这是StackOverflow用户PassKit和Kheldar对Swift 3+项目的建议:

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

资料来源:https : //stackoverflow.com/a/27330998/128579

较早的Objective-C答案

对于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版本中可用的方法,请参见此文章的先前编辑内容。请注意,由于进行了大量的编辑,因此此页面上的以下注释/其他答案可能没有意义。毕竟,这是一个有四年历史的问题。;-)


这种方法的一个缺点:如果您的webView包含自定义网址(someapplication://),则它们将失败,因为您始终返回YES。
jpoz 2010年

6
@stigi尝试将密钥从@“ User_Agent”更改为@“ User-Agent”。那对我有用。

有谁知道如何通过AJAX调用来持久化它?
菲利佩·萨比诺

1
@nmr这是3.x天后的事情了。请参阅我的文章顶部的“ 2012更新”。不,对不起,我不能说为什么那时有必要。TCP堆栈中的另一层可能会将带下划线的标头转换为带连字符的标头。我只能说我认为他们已经解决了此问题,因此我不必担心。
路易·圣爱慕

1
最初可以在Web视图的控制器中完成此操作吗?像先检查url并基于该调用一样[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];吗?基本上我已经尝试过了,但是没有解决。只想知道是否有可能,因为您建议在启动时首先这样做。
Pedroinpeace

19

我也遇到了这个问题,并尝试了所有方法。我发现只有此方法有效(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中设置什么。


2
只有这个对我有用!您现在可以使用较短的版本: [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"UserAgent": @"custom agent" }];
Yariv Nissim 2012年

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

Mac上Safari的用户代理字符串是什么样的?
2015年

12

在Swift中非常简单。只需将以下内容放入您的应用程序委托中即可。

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

如果要追加到现有代理字符串,则:

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

注意:您可能需要卸载并重新安装该应用程序,以避免附加到现有代理字符串中。


谢谢。节省大量时间!
KD。

感谢@Kheldar更新了Swift3。对于早期的Swift版本,请检查编辑历史记录。
PassKit '16

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。


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; zh-CN)AppleWebKit / 528.18(KHTML,如Gecko)Mobile / 7D11 \ r \ n

以上是剖析后的HTTP数据包中显示的内容,实质上证实了Sfjava在该论坛中引用的内容。有趣的是,“ User-Agent”变成了“ User_agent”。


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

通过汇总Louis St-Amour的答案该问题/答案NSUserDefaults+UnRegisterDefaults类别,您可以在应用运行时随时使用以下方法来启动和停止用户代理欺骗:

#define kUserAgentKey @"UserAgent"

- (void)startSpoofingUserAgent:(NSString *)userAgent {
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}

- (void)stopSpoofingUserAgent {
    [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}

1
已在iPhone 5设备上的iOS7中经过测试,并且可以正常运行,但不能在模拟器上运行,但这无关紧要。谢谢(你的)信息。
New2ObjectiveC

startSpoofingUserAgent对我有用,但是unregisterDefaultForKey不是有效的命令。我要使它起作用的唯一方法是使用原始值对registerDefaults进行重置。-rrh
Richie Hyatt

unregisterDefaultForKey:在此处实现:stackoverflow.com/a/18109860/1580288(如答案中所述)。
EthanB


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之前使用它。


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

}

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

0

要将定制内容仅添加到当前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];

0

苹果很快将停止接受带有UIWebView的应用程序。在下面找到有关如何在WKWebView中更改用户代理的信息。

let config = WKWebViewConfiguration()

config.applicationNameForUserAgent = "My iOS app"

webView = WKWebView(frame: <the frame you need>, configuration: config)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.