Ответ 1
Вы с удовольствием услышите, что WKWebView
только что приобрел свойство customUserAgent
в iOS 9
и OSX 10.11
Пример:
wkWebView.customUserAgent = "your agent"
Как установить пользовательскую строку 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?
Вы с удовольствием услышите, что WKWebView
только что приобрел свойство customUserAgent
в iOS 9
и OSX 10.11
Пример:
wkWebView.customUserAgent = "your agent"
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
Это можно сделать еще проще, используя "жертвенный" 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 используют один и тот же пользовательский агент, но этот подход может вызвать проблемы, если это изменится в будущем.
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])
В моем быстром 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)
}