Placer un agent d'utilisation dans WKWebview

comment définir une chaîne useragent 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 le gestionnaire d'utilisateurs n'est défini que pour cette seule requête. La première autre requête (par exemple un forward), signifie que l'utilisateur est réinitialisé par défaut à nouveau. Comment puis-je configurer de manière plus permanente le wkwebview pour utiliser ma chaîne UserAgent personnalisée?

27
demandé sur usr2564301 2014-11-18 15:34:13

5 réponses

vous serez heureux d'entendre que WKWebView vient de gagner un customUserAgent propriété dans iOS 9 et OSX 10.11

exemple:

wkWebView.customUserAgent = "your agent" 
48
répondu Erik Aigner 2017-06-27 07:55:28

mise à jour:

à partir de 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 le paramétrage de celui-ci va complètement outrepasser l'agent utilisateur par défaut. Si pour une raison quelconque vous devez juste ajouter un agent 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 à l'aide d'un sacrificiel UIWebView

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


Vieille réponse:

comme indiqué dans mon commentaire, vous pouvez utiliser la même approche que décrite ici: Change User Agent in UIWebView (iPhone SDK)

maintenant, si vous voulez obtenir l'agent utilisateur, vous avez besoin d'avoir une instance de WKWebView et d'évaluer ce javascript dessus:

navigator.userAgent

le problème est que si vous définissez un agent utilisateur personnalisé après un WKWebView a été instancié vous obtiendrez toujours le même agent utilisateur. Pour résoudre ce problème, vous devez retrouver la vue web. Voici un exemple de ce à 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 journal:

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

ceci pourrait être rendu encore plus simple en utilisant un UIWebView" sacrificiel " puisqu'il évalue javascript de façon 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

en ce moment UIWebView et WKWebView utilisent le même agent utilisateur mais cette approche pourrait causer des problèmes si cela change dans le futur.

15
répondu Nikola Lajic 2017-09-22 08:51:37

Custom User Agent

pour définir un Agent utilisateur personnalisé, vous pouvez utiliser customUserAgent propriété:

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

disponible: iOS 9+

ajouter à L'agent utilisateur par défaut

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

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

alors il ressemblera par exemple comme:

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+

2
répondu Marián Černý 2018-08-19 07:27:56

WKWebView Swift 3 Exemple:

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

Note à ceux qui essaient de le faire en utilisant Storyboard ou Interface Builder: malheureusement, Xcode ne supporte pas actuellement l'utilisation de WKWebView dans Storyboards (Xcode version 8.3.2), donc vous devez ajouter la vue web manuellement dans votre code.

UIWebView Swift 3 Exemple:

UserDefaults.standard.register(defaults: ["UserAgent": userAgentValue])
0
répondu Alex 2017-05-31 18:23:10

dans mon cas swift 3, j'ai besoin de l'application entière en utilisant un client userAgent, voici ma solution dans AppDelegate. Ici, utiliser UIWebview est parce que je n'ai pas besoin de configurer le WKWebViewConfiguration , parce que 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
répondu Stephen Chen 2017-06-21 10:36:09