Swift webview: How to call correctly swift code from javascript? Swift webview: How to call correctly swift code from javascript? ios ios

Swift webview: How to call correctly swift code from javascript?


You have everything set up properly, but you aren't giving your WKWebViewConfiguration instance to the WKWebView. Since the configuration has the details of the Javascript/Swift bridge, you can't talk back and forth.

override func loadView() {    // ...    var config = WKWebViewConfiguration()    config.userContentController = contentController    self.webView = WKWebView(frame: self.view.frame, configuration: config)    self.view = self.webView!}


my 2 cents, using a javascript callback with JSON ... for full class definition and layout, refer to adam's code

import UIKitimport WebKitclass ViewController: UIViewController, WKScriptMessageHandler {    var webView: WKWebView?    ...

then

override func loadView() {    let theConfiguration = WKWebViewConfiguration()    let contentController = theConfiguration.userContentController    // alert fix, at start to allow a JS script to overwrite it    contentController.addUserScript( WKUserScript(        source: "window.alert = function(message){window.webkit.messageHandlers.messageBox.postMessage({message:message});};",        injectionTime: WKUserScriptInjectionTime.AtDocumentStart,        forMainFrameOnly: true    ) )    contentController.addScriptMessageHandler(self, name: "messageBox")    self.webView = WKWebView(frame: self.view.frame, configuration: theConfiguration)    // and here things like: self.webView!.navigationDelegate = self    self.view = self.webView!  // fill controllers view}

and specifically

func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {    if message.name == "messageBox" {        let sentData = message.body as! Dictionary<String, String>        let message:String? = sentData["message"]        let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)        alertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment:"btnOK"), style: .Default, handler: nil))        self.presentViewController(alertController, animated: true) {}    }}