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