ios - type - Establecer usuario en WKWebview
wkwebview load url (5)
¿Cómo configuro una cadena de agente de usuario personalizada en un WKWebView? Estoy intentando incrustar la versión de mi aplicación para que mi servidor pueda ver qué funciones están disponibles. He encontrado el siguiente método:
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);
Pero esto significa que el agente de usuario solo está configurado para esa única solicitud. La primera solicitud (p. Ej., Un reenvío) significará que el agente de usuario se restablecerá de manera predeterminada. ¿Cómo puedo configurar más permanentemente el wkwebview para usar mi cadena de usuario personalizada?
Agente de usuario personalizado
Para configurar un agente de usuario personalizado, puede usar la propiedad customUserAgent
:
let webConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.customUserAgent = "ExampleApp/1.0 (iPhone)"
Disponible: iOS 9+
Anexar al agente de usuario predeterminado
Para agregar una cadena personalizada en el agente de usuario predeterminado, puede usar la propiedad applicationNameForUserAgent
:
let webConfiguration = WKWebViewConfiguration()
webConfiguration.applicationNameForUserAgent = "ExampleApp/1.0 (iPhone)"
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
Entonces buscaremos ejemplos como:
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+
En mi caso de swift 3, necesito una aplicación completa usando un UserAgent personalizado, aquí está mi solución en AppDelegate. Aquí utilizando UIWebview es porque no necesito configurar la configuración WKWebView , porque solo necesito la cadena 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)
}
Le alegrará saber que WKWebView
acaba de obtener una propiedad customUserAgent
en iOS 9
y OSX 10.11
Ejemplo:
wkWebView.customUserAgent = "your agent"
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
Nota para aquellos que intentan hacer esto usando Storyboard o Interface Builder: Desafortunadamente, Xcode actualmente no admite el uso de WKWebView
en Storyboards (Xcode versión 8.3.2), por lo que debe agregar la vista web manualmente en su código.
UIWebView
Swift 3:
UserDefaults.standard.register(defaults: ["UserAgent": userAgentValue])
Actualizar:
A partir de iOS 9.0 es posible configurar el agente de usuario directamente (como se indica en otras respuestas). Pero es importante tener en cuenta que la configuración anulará completamente el agente de usuario predeterminado. Si por alguna razón necesita simplemente agregar un agente de usuario personalizado, utilice uno de los siguientes métodos.
webView.evaluateJavaScript("navigator.userAgent") { [weak webView] (result, error) in
if let webView = webView, let userAgent = result as? String {
webView.customUserAgent = userAgent + "/Custom Agent"
}
}
o usando un UIWebView sacrificial
webView.customUserAgent = (UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? "") + "/Custom agent"
Respuesta antigua:
Como se indicó en mi comentario, puede utilizar el mismo enfoque que se describe aquí: Cambiar el agente de usuario en UIWebView (iPhone SDK)
Ahora, si desea obtener el agente de usuario, necesita tener una instancia de WKWebView y evaluar este javascript en él:
navigator.userAgent
El problema es que si configura un agente de usuario personalizado después de que se haya creado una instancia de WKWebView, siempre obtendrá el mismo agente de usuario. Para resolver este problema tienes que reinstalar la vista web. Aquí hay una muestra de cómo podría verse esto:
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);
}];
}];
El código anterior registrará:
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
Alternativa
Esto podría hacerse aún más simple utilizando un UIWebView "sacrificial" ya que evalúa javascript de forma síncrona.
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);
}];
Que registra lo mismo:
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 este momento, UIWebView y WKWebView utilizan el mismo agente de usuario, pero este enfoque podría causar problemas si eso cambia en el futuro.