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?
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"
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"
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
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.
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+
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+
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])
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)
}