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) {} }}