在 UIWebView 中更改用户代理

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

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

108946 次浏览

它应该像 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.

你必须使用 NSULConnection 来获取 response 数据。将 response 数据设置为 UIWebView,webView 应该会显示:

[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];

摩登斯威夫特

以下是来自 stackOverflow 和 Kheldar 用户对 Swift 3 + 项目的建议:

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

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

早期的 Objective-C 答案

随着 iOS5的变化,我推荐以下方法,最初来自于这个 StackOverflow 问题: UIWebViewiOS5改变用户代理,正如下面的答案所指出的。在该页面的评论中,它似乎在4.3及更早版本中也能工作。

时运行此代码一次,以更改“ UserAgent”默认值 你的应用程序启动:

NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];

如果您需要在4.3/5.0之前的 iOS 版本中工作的方法,请参阅本文之前的编辑。请注意,由于大量的编辑,下面的评论/其他答案在这个页面上可能没有意义。毕竟,这是一个四年前的问题。;-)

我就是这样解决问题的:

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

谢谢大家。

使用@“ User _ Agent”只会在 GET 请求中显示一个自定义头。

User _ agent: Foobar/1.0 r n < br > User-Agent: Mozilla/5.0(iPhone; U; CPU) IPhone OS 3 _ 1 _ 2,如 Mac OS X; en-us) AppleWebKit/528.18(KHTML,如 壁虎) Mobile/7D11r n

上面的内容出现在解剖的 HTTP 数据包中,基本上证实了 Sfjava 从该论坛引用的内容。值得注意的是,“ User-Agent”变成了“ User _ agent”

这个解决方案似乎被认为是一个相当聪明的方法

更改 uiwebkit-http-request 的标头

它使用方法 Swizzling,您可以在 CocoaDev 页面上了解更多有关它的信息

看看吧!

实际上,在 should dStartLoadWithRequest 看起来中为 NSURLRequest 参数添加任何头字段都可以工作,因为请求响应 setValue: ForHTTPHeaderField ——但它实际上可以工作——请求发送时没有头字段。

所以我在 should dStartLoadWithRequest 中使用了这个解决方案,它只是将给定的请求复制到一个新的可变请求,然后重新加载它。这实际上修改了发送出去的消息头。

if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
[modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
[webViewArgument loadRequest:modRequest];
return NO;
}

不幸的是,这仍然不允许覆盖用户代理的 http 头,这显然是被苹果覆盖。我想要覆盖它,你必须自己管理一个 NSULConnection。

我也有这个问题,我尝试了所有的方法,我发现只有这个方法可以工作(iOS 5.x) : UIWebViewiOS5改变用户代理

其原理是在用户设置中永久设置用户代理。这样就可以了; 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 中设置什么。

请在 AppGenerate.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];
}

通过合并 路易斯 · 圣爱的回答NSUserDefaults+UnRegisterDefaults类别 从这个问题[答案]中,您可以使用以下方法在应用程序运行时随时启动和停止用户代理欺骗:

#define kUserAgentKey @"UserAgent"


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


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

我也面临着同样的问题。我想添加一些信息的用户代理,也需要保持原来的用户代理的网页。我用下面的代码解决了这个问题:

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

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

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

如果您想要追加到现有的代理字符串,那么:

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

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

要向当前 UserAgent 值添加自定义内容,请执行以下操作:

1-从一个新的 WEBVIEW 获取用户代理值

2-将自定义内容附加到它

3-使用 UserAgent 键将新值保存到字典中

4-将字典保存在 standard UserDefault 中。

请看下面的例子:

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

苹果将很快停止接受使用 UIWebView 的应用程序。

let config = WKWebViewConfiguration()


config.applicationNameForUserAgent = "My iOS app"


webView = WKWebView(frame: <the frame you need>, configuration: config)