在UIWebView中更改用户代理

时间:2009-01-25 21:57:56

标签: ios iphone cocoa-touch uiwebview

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

是否可以在现有UIWebView控件中自定义UserAgent,例如,对于Windows应用程序中的嵌入式IE浏览器?

14 个答案:

答案 0 :(得分:92)

Modern Swift

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

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

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

早期目标-C答案

对于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-AmourNSUserDefaults+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)