uiwebview webkit ios8 javascriptcore wkwebview

uiwebview - Cómo obtener JSContext desde WKWebView



webkit ios8 (3)

No puede obtener el contexto, porque el diseño y el javascript se manejan en otro proceso.

En su lugar, agregue scripts a su configuración de webview y configure su controlador de vista (u otro objeto) como el controlador de mensajes de script.

Ahora, envía mensajes desde JavaScript así:

window.webkit.messageHandlers.interOp.postMessage(message)

Su manejador de mensajes de script recibirá una devolución de llamada:

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ NSLog(@"%@", message.body); }

En UIWebView, puedo obtener JSContext través de:

[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]

La misma manera no funciona en WKWebView y la aplicación se bloquea cuando llega a esta línea de código.

¿Hay una manera de obtener JSContext en WKWebView?

gracias por adelantado.


configure su wkwebview de esta manera y agregue un controlador en consecuencia y publique un mensaje desde el script en un patrón similar

NSString *myScriptSource = @"alert(''Hello, World!'')"; WKUserScript *s = [[WKUserScript alloc] initWithSource:myScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; WKUserContentController *c = [[WKUserContentController alloc] init]; [c addUserScript:s]; // Add a script message handler for receiving "buttonClicked" event notifications posted from the JS document using window.webkit.messageHandlers.buttonClicked.postMessage script message [c addScriptMessageHandler:self name:@"buttonClicked"]; WKWebViewConfiguration *conf = [[WKWebViewConfiguration alloc] init]; conf.userContentController = c; WKWebView *webview = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:conf]; [self.view addSubview:webview]; webview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; // Do any additional setup after loading the view, typically from a nib. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; [webview loadRequest:request];

implementar el controlador de mensajes de script "WKScriptMessageHandler" con el nombre del método

#pragma mark -WKScriptMessageHandler - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@"buttonClicked"]) { self.buttonClicked ++; } // JS objects are automatically mapped to ObjC objects id messageBody = message.body; if ([messageBody isKindOfClass:[NSDictionary class]]) { NSString* idOfTappedButton = messageBody[@"ButtonId"]; [self updateColorOfButtonWithId:idOfTappedButton]; } }

y publicar el formulario de mensaje js como este

var button = document.getElementById("clickMeButton"); button.addEventListener("click", function() { var messgeToPost = {''ButtonId'':''clickMeButton''}; window.webkit.messageHandlers.buttonClicked.postMessage(messgeToPost); },false);


XWebView es una buena solución para su problema. Puede establecer un puente entre nativo y JS, y proporcionar una API de estilo de enlace.