在WKWebview中设置useragent

Pve*_*vel 33 user-agent ios wkwebview

如何在WKWebView中设置自定义的useragent字符串?我正在尝试嵌入我的应用程序版本,以便我的服务器端可以看到可用的功能.我找到了以下方法:

let userAgent = "MyApp/1.33.7"
request.setValue(userAgent, forHTTPHeaderField: "User-Agent")

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
    let content = NSString(data: data, encoding: NSUTF8StringEncoding)
    self.web!.loadHTMLString(content!, baseURL: url)
}
self.web!.loadRequest(request);
Run Code Online (Sandbox Code Playgroud)

但这意味着仅为该单个请求设置了useragent.第一个其他请求(例如转发)将意味着再次将useragent重置为默认值.如何更永久地配置wkwebview以使用我的自定义useragent字符串?

Eri*_*ner 62

你会很高兴听到WKWebView刚刚获得customUserAgent房产iOS 9OSX 10.11

例:

wkWebView.customUserAgent = "your agent" 
Run Code Online (Sandbox Code Playgroud)

  • @haykam是的wkWebView.customUserAgent ="你的经纪人" (6认同)

Nik*_*jic 24

更新:

从iOS 9.0开始,可以直接设置用户代理(如其他答案中所述).但重要的是要注意,设置它将完全覆盖默认用户代理.如果由于某种原因您需要添加自定义用户代理,请使用以下方法之一.

webView.evaluateJavaScript("navigator.userAgent") { [weak webView] (result, error) in
    if let webView = webView, let userAgent = result as? String {
        webView.customUserAgent = userAgent + "/Custom Agent"
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用牺牲UIWebView

webView.customUserAgent = (UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? "") + "/Custom agent"
Run Code Online (Sandbox Code Playgroud)


老答案:

如我的评论中所述,您可以使用与此处所述相同的方法:在UIWebView中更改用户代理(iPhone SDK)

现在,如果你想获得用户代理,你需要有一个WKWebView的实例并在其上评估这个javascript:

navigator.userAgent
Run Code Online (Sandbox Code Playgroud)

问题是,如果在实例化WKWebView之后设置自定义用户代理,您将始终获得相同的用户代理.要解决此问题,您必须重新实例化Web视图.以下是一个示例:

self.wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
__weak typeof(self) weakSelf = self;

[self.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
    __strong typeof(weakSelf) strongSelf = weakSelf;

    NSString *userAgent = result;
    NSString *newUserAgent = [userAgent stringByAppendingString:@" Appended Custom User Agent"];

    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

    strongSelf.wkWebView = [[WKWebView alloc] initWithFrame:strongSelf.view.bounds];

    // After this point the web view will use a custom appended user agent
    [strongSelf.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
        NSLog(@"%@", result);
    }];
}];
Run Code Online (Sandbox Code Playgroud)

上面的代码将记录:

Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411 Appended Custom User Agent
Run Code Online (Sandbox Code Playgroud)

替代

通过使用"牺牲"UIWebView可以使这更简单,因为它同步评估javascript.

UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *newUserAgent = [userAgent stringByAppendingString:@" Appended Custom User Agent"];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

self.wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[self.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
    NSLog(@"%@", result);
}];
Run Code Online (Sandbox Code Playgroud)

记录相同的东西:

Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411 Appended Custom User Agent
Run Code Online (Sandbox Code Playgroud)

现在UIWebView和WKWebView使用相同的用户代理,但如果将来发生变化,这种方法可能会导致问题.

  • 在iOS 10.3.3上,我可以更改`customUserAgent`,它无需重新实例化`WKWebView`即可生效. (3认同)

Mar*_*rný 12

自定义用户代理

要设置自定义用户代理,可以使用customUserAgent属性:

let webConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.customUserAgent = "ExampleApp/1.0 (iPhone)"
Run Code Online (Sandbox Code Playgroud)

可用:iOS 9+

附加到默认的用户代理

要在默认用户代理的和处添加自定义字符串,可以使用applicationNameForUserAgent属性:

let webConfiguration = WKWebViewConfiguration()
webConfiguration.applicationNameForUserAgent = "ExampleApp/1.0 (iPhone)"
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
Run Code Online (Sandbox Code Playgroud)

然后看起来像这样:

Mozilla/5.0 (iPhone; CPU iPhone OS 11_2 like Mac OS X) AppleWebKit/604.4.7
(KHTML, like Gecko) ExampleApp/1.0 (iPhone)
                    ^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

可用:iOS 9+