Search code examples
swiftwkwebviewios13ios12

Invoke a swift function from WKWebView


I am rendering a webpage in WKWebView, and in that webpage, i need to override one button action with a native swift code.Like in webpage on click of a button it navigates to another page, but in mobile, I need a storyboard to be displayed. I am not getting any direct links to implement this. below is the code sample i tried:

let webConfiguration = WKWebViewConfiguration()
let userController = WKUserContentController()

    userController.add(self, name: "performClick")

    webConfiguration.userContentController = userController

    webView = WKWebView(frame: .zero, configuration: webConfiguration)

    webView.uiDelegate = self

    webView.navigationDelegate = self

    view = webView


Solution

  • After a lot of search, I finally got the answer. Posting this if this helps someone.

    var webView: WKWebView?
    var webConfig:WKWebViewConfiguration {
        get {
    
            let webCfg:WKWebViewConfiguration = WKWebViewConfiguration()
            let userController:WKUserContentController = WKUserContentController()
            userController.add(self, name: "submit")
            let js:String = buttonClickEventTriggered()
            let userScript:WKUserScript =  WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false)
            userController.addUserScript(userScript)
            webCfg.userContentController = userController;
            return webCfg;
        }
    }
      override func viewDidLoad() {
        super.viewDidLoad()
        self.webView = WKWebView(frame: self.view.frame, configuration: webConfig)
        self.webView!.navigationDelegate = self
        self.view = webView!
        let url = URL(string:"your URL here")
        let req = NSURLRequest(url:url! as URL)
        self.webView!.load(req as URLRequest)
     }
    func buttonClickEventTriggered() ->String{
        
        let script:String = "document.getElementById('your button id here').addEventListener('click', function () {window.webkit.messageHandlers.submit.postMessage('submited');});"//Make sure you have mapped the name correctly under userController.add
        return script;
    }
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print("Sucessss")
        if(message.name == "submit") {
            print("It does ! \(message.body)")
            // Your code goes here
        }
    }