Как изменить пользовательский агент WKWebview в OS X Yosemite?

Как изменить пользовательский агент, используемый WKWebview?

Со старым WebView я мог бы написать следующее, чтобы изменить пользовательский агент:

[myWebView setCustomUserAgent:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4)
 AppleWebKit/537.77.4 (KHTML,like Gecko) Version/7.0.5 Safari/537.77.4"];

person Jim Bak    schedule 17.10.2014    source источник


Ответы (6)


В Swift очень просто. Просто поместите следующее в свой App DelegatedidFinishLaunchingWithOptions.

NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent" : "Custom Agent"])

Если вы хотите добавить к существующей строке агента, то:

let userAgent = UIWebView().stringByEvaluatingJavaScriptFromString("navigator.userAgent")! + " Custom Agent"
NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent" : userAgent])

Примечание. Вам нужно будет удалить и переустановить приложение, чтобы избежать добавления к существующей строке агента.

person PassKit    schedule 06.12.2014
comment
А как насчет Obj C? а для Mac? Мог бы я по-прежнему использовать uiwebview для Mac? - person Jim Bak; 07.12.2014
comment
Оба вышеперечисленных работают как для UIWebView, так и для WKWebView на iOS. Ответ Мичо ниже предоставляет Objective-C, который работает с UIWebView в OS X, хотя не тестировал последние сборки Xcode, чтобы подтвердить, работает ли он по-прежнему с WKWebView, как он предлагает - person PassKit; 07.12.2014
comment
Они не просили ни Swift, ни iOS. API не 1: 1 - person uchuugaka; 19.05.2015
comment
Это правда, но я впервые столкнулся с этим вопросом, когда исследовал, как это сделать в Swift для iOS. По мере того, как все больше разработчиков переходят на Swift, этот ответ приобретает некоторую ценность. - person PassKit; 19.05.2015
comment
Спас мой бекон, потратив день на изучение того, как реализовать собственные протоколы NSURL, это был гораздо более простой и понятный вариант. - person Rocket Garden; 25.02.2016

У меня нет на это ответа. Тем не менее, некоторые подсказки из моих исследований:

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

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

В OSX для элементов WebView был setCustomUserAgent метод, который помогал.

Однако это не работает для WKWebView (по крайней мере, в OSX). Я также не смог найти никакой документации по этому поводу от Apple.

Надеюсь, кто-нибудь сможет помочь!

person micho    schedule 25.10.2014

Я столкнулся с той же проблемой, но мне удалось обойти ее, используя комбинацию loadHTMLString на WKWebView и NSMutableURLRequest для выполнения тяжелой работы.

Мои поиски того, как вызвать какой-либо метод на самом WKWebView, привели меня к http://trac.webkit.org/changeset/165594, что подразумевает, что для этого есть частный метод _setCustomUserAgent. Я недостаточно разбираюсь в какао / свифте, чтобы понять это.

В итоге я использовал приведенный ниже код, так как мне действительно нужно только получить содержимое одного URL-адреса и отобразить его, но это может быть в некотором роде полезно. Он просто загружает содержимое URL-адреса в WKWebView в виде строки, я подозреваю, что вы можете потерять навигацию назад / вперед и тому подобное, и это будет работать только для начального отображения страницы, поскольку WKWebView возьмет на себя клики и загрузку ресурсов .

(обратите внимание, этот пример написан на Swift, а не на Objective-C)

self.webView = WKWebView(frame: webViewRect, configuration: webViewConfig)

//  create the request
let url = NSURL(string: "https://example.com/")
let request = NSMutableURLRequest(URL: url!)
request.setValue("YourUserAgent/1.0", forHTTPHeaderField: "User-Agent")

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
    let content = NSString(data: data, encoding: NSUTF8StringEncoding)
    self.webView!.loadHTMLString(content!, baseURL: url)
}
person Rogier Spieker    schedule 26.10.2014

Это было бы не идеально, но вы, вероятно, могли бы реализовать собственный обработчик NSURLProtocol для перехвата HTTP-запросов и изменения их с помощью вашего настраиваемого заголовка пользовательского агента. Я не думаю, что это сработает на iOS, поскольку WKWebView делает запросы вне процесса и обходит любые зарегистрированные протоколы NSURL. Но может ли он работать на OS X?

person TomSwift    schedule 10.02.2015

С введенным пользователем URL-адресом в текстовом поле вы можете полностью управлять NSURLRequest с помощью объекта NSMutableURLRequest и установить для него поле заголовка.

Однако в отношении вещей, которые пользователь фактически нажимает в веб-представлении, вы не можете контролировать очевидную и четко задокументированную область Objective-C. Я не вижу никаких задокументированных способов, помимо того, к чему, похоже, подталкивает WKWebView - JavaScript. Итак, это означает, что вы можете делать такие вещи, как опубликованные здесь: Имитировать пользовательский агент в javascript? Использование API-интерфейсов внедрения скриптов.

Вот почему мне не нравится WKWebView. Мне это нравится, но я не хочу учиться делать половину всего на JavaScript.

Итак, вы можете создать для этого объект WKUserScript и установить для него время внедрения WKUserScriptInjectionTimeAtDocumentStart. Это позволит вам обрабатывать запросы от элементов страницы в документе до тех пор, пока сама страница не загружает другие конфликтующие сценарии.

person uchuugaka    schedule 19.05.2015

Сначала выйдите из Safari. Затем откройте Терминал, вставьте эту команду и нажмите ввод:

по умолчанию пишется com.apple.Safari CustomUserAgent "\" Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit / 538.46 (KHTML, как Gecko) Версия / 7.1 Safari / 537.85.7 \ ""

Откройте Safari, и все готово.

Чтобы отменить это изменение, закройте Safari и вставьте эту команду в терминал:

по умолчанию удалить com.apple.Safari CustomUserAgent

Иногда может потребоваться перезагрузка, чтобы эти изменения вступили в силу, не знаю почему, это может быть проблема кеша.

person VincentG    schedule 26.10.2014
comment
Это даже не вопрос. - person Peanut; 09.06.2016