web-dev-qa-db-fra.com

Définir useragent dans WKWebview

Comment définir une chaîne d'agent d'utilisateur personnalisée dans un WKWebView? J'essaie d'intégrer la version de mon application afin que mon côté serveur puisse voir quelles fonctionnalités sont disponibles. J'ai trouvé la méthode suivante:

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

Mais cela signifie que l’agent utilisateur n’est défini que pour cette requête unique. La première autre demande (par exemple, une transmission) signifie que l'utilisateur est réinitialisé à sa valeur par défaut. Comment puis-je configurer de manière plus permanente wkwebview pour utiliser ma chaîne personnalisée useragent?

29
Pvel

Vous serez heureux d'apprendre que WKWebView vient d'obtenir une propriété customUserAgent dans iOS 9 et OSX 10.11

Exemple: 

wkWebView.customUserAgent = "your agent" 
54
Erik Aigner

Mettre à jour:

Depuis iOS 9.0, il est possible de définir l'agent utilisateur directement (comme indiqué dans d'autres réponses). Mais il est important de noter que son paramétrage remplacera complètement l'agent utilisateur par défaut. Si, pour une raison quelconque, vous devez simplement ajouter un agent d'utilisateur personnalisé, utilisez l'une des approches suivantes.

webView.evaluateJavaScript("navigator.userAgent") { [weak webView] (result, error) in
    if let webView = webView, let userAgent = result as? String {
        webView.customUserAgent = userAgent + "/Custom Agent"
    }
}

ou en utilisant un UIWebView sacrificiel

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


Ancienne réponse:

Comme indiqué dans mon commentaire, vous pouvez utiliser la même approche que celle décrite ici: Modifier l'agent utilisateur dans UIWebView (iPhone SDK)

Maintenant, si vous voulez obtenir l'agent utilisateur, vous devez avoir une instance de WKWebView et évaluer ce javascript dessus:

navigator.userAgent

Le problème est que si vous définissez un agent d'utilisateur personnalisé après l'instanciation de WKWebView, vous obtiendrez toujours le même agent d'utilisateur. Pour résoudre ce problème, vous devez rétablir la vue Web. Voici un exemple à quoi cela pourrait ressembler:

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

Le code ci-dessus va enregistrer:

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

Cela pourrait être rendu encore plus simple en utilisant un UIWebView "sacrificiel" puisqu'il évalue le javascript de manière synchrone.

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

Qui enregistre la même chose:

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

À l'heure actuelle, UIWebView et WKWebView utilisent le même agent d'utilisateur, mais cette approche pourrait poser problème si cela devait changer à l'avenir.

17
Nikola Lajic

Agent utilisateur personnalisé

Pour définir un agent d'utilisateur personnalisé, vous pouvez utiliser la propriété customUserAgent:

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

Disponible: iOS 9+

Ajouter à l'agent d'utilisateur par défaut

Pour ajouter une chaîne personnalisée à et à l'agent utilisateur par défaut, vous pouvez utiliser la propriété applicationNameForUserAgent:

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

Ensuite, cela ressemblera par exemple à:

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

Disponible: iOS 9+

3
Marián Černý

Exemple 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

Remarque à l'intention de ceux qui essaient de le faire avec Storyboard ou Interface Builder: Malheureusement, Xcode ne prend actuellement pas en charge l'utilisation de WKWebView dans Storyboards (Xcode version 8.3.2). Vous devez donc ajouter la vue Web manuellement dans votre code.

Exemple UIWebView Swift 3:

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

Dans mon cas Swift 3, j'ai besoin de l'ensemble de l'application utilisant un agent utilisateur personnalisé, voici ma solution dans AppDelegate. Ici, utiliser UIWebview est parce que je n'ai pas besoin de configurer le WKWebViewConfiguration , car je n'ai besoin que de la chaîne 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)
}
0
Stephen Chen