undeclared type support previous delegate broken before ios user-agent wkwebview

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.