Установить 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 ответов:
Вы будете рады услышать, что
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); }];
Который регистрирует то же самое:
Сейчас UIWebView и WKWebView используют один и тот же агент пользователя, но этот подход может вызвать проблемы, если это изменится в будущем.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
Пользовательский Агент Пользователя
Для установки пользовательского агента можно использовать свойство
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) }