Подтвердить что ты не робот

Установить 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 будет reset по умолчанию снова. Как я могу более точно настроить wkwebview для использования моей пользовательской строки useragent?

4b9b3361

Ответ 1

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

Пример:

wkWebView.customUserAgent = "your agent" 

Ответ 2

Update:

Как и в 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

Alternative

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

Ответ 3

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 version 8.3.2), поэтому вам нужно добавить веб-представление вручную в своем код.

UIWebView Пример Swift 3:

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

Ответ 4

В моем быстром 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)
}