Установить useragent в WKWebview


Как задать пользовательскую строку useragent в WKWebView? Я пытаюсь встроить версию моего приложения, чтобы моя серверная сторона могла видеть, какие функции доступны. Я нашел следующий метод:

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

Но это означает, что useragent установлен только для этого отдельного запроса. Первый другой запрос (например, переадресация), будет означать, что useragent снова сбрасывается по умолчанию. Как я могу больше постоянно настраивать wkwebview, чтобы использовать мои пользовательские строки UserAgent?

5 27

5 ответов:

Вы будете рады услышать, что WKWebView только что приобрел свойство customUserAgent в iOS 9 и OSX 10.11

Пример:

wkWebView.customUserAgent = "your agent" 

Обновление:

Начиная с 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"
    }
}

Или с помощью жертвенного UIWebView

webView.customUserAgent = (UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? "") + "/Custom agent"


старый ответ:

Как отмечено в моем комментарии, Вы можете использовать тот же подход, что и описано здесь: изменить пользовательский агент в UIWebView (iPhone SDK)

Теперь, если вы хотите получить пользовательский агент, вам нужно иметь экземпляр WKWebView и оценить этот javascript на нем:

navigator.userAgent

Проблема заключается в том, что если вы устанавливаете пользовательский агент пользователя после создания экземпляра WKWebView, вы всегда будете получать один и тот же агент пользователя. Чтобы решить эту проблему, необходимо повторно создать веб-представление. Вот пример того, как это может выглядеть:

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

Приведенный выше код будет журнал:

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

Альтернатива

Это можно было бы сделать еще проще, используя "жертвенный" 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);
}];

Который регистрирует то же самое:

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
Сейчас UIWebView и WKWebView используют один и тот же агент пользователя, но этот подход может вызвать проблемы, если это изменится в будущем.

Пользовательский Агент Пользователя

Для установки пользовательского агента можно использовать свойство customUserAgent:

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

Доступно: iOS 9+

Добавить к Агенту пользователя по умолчанию

Для добавления пользовательской строки В и агента пользователя по умолчанию можно использовать свойство applicationNameForUserAgent:

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

Тогда это будет выглядеть, например, так:

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

Доступно: iOS 9+

WKWebView Swift 3 Пример:

let userAgentValue = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4"
webView.customUserAgent = userAgentValue

Примечание Для тех, кто пытается сделать это с помощью Storyboard или Interface Builder: к сожалению, Xcode в настоящее время не поддерживает использование WKWebView в Storyboards (Xcode версии 8.3.2), поэтому вам придется добавить веб-представление вручную в свой код.

UIWebView Swift 3 Пример:

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

В моем случае swift 3, мне нужно все приложение, используя пользовательский userAgent, вот мое решение в AppDelegate. Здесь использование UIWebview связано с тем, что мне не нужно настраивать WKWebViewConfiguration , потому что мне нужна только строка userAgent

 fileprivate func setupGlobalWebviewUserAgent() {

    let webview = UIWebView()
    var newUserAgent = webview.stringByEvaluatingJavaScript(from: "navigator.userAgent")
    newUserAgent = newUserAgent?.appending("custom user agent")
    let dictionary = Dictionary(dictionaryLiteral: ("UserAgent", newUserAgent))
    UserDefaults.standard.register(defaults: dictionary)
}