Search code examples
javascriptjqueryiosswiftswift2

Catch Javascript Event in iOS WKWebview with Swift


I am building an app with web programming languages and want to start the camera when the user clicks on an HTML button. Since I want my camera view to be a custom one, I need to design it with Swift. So when the user clicks on this HTML button, I want to "catch" this click in Swift so I can start my native camera view.

I know it can be done with the WKWebview, but I don't really know how to do that.

For example, my Javascript (jQuery) code could look like that :

// User clicks to start the native camera with Swift
$(".camera_button").click(function() {
    // Function to call the camera view from JS to Swift
});

Can you help me to do that?

Thanks.


Solution

  • Based on the answer from @Alex Pelletier, which really helped me, here is the solution the my question.

    In my "loadView()" function, here is what I have :

    let contentController = WKUserContentController();
    contentController.addScriptMessageHandler(
        self,
        name: "callbackHandler"
    )
    
    let config = WKWebViewConfiguration()
    config.userContentController = contentController
    
    webView = WKWebView(frame: CGRectZero, configuration: config)
    webView.navigationDelegate = self
    view = webView
    

    My function to handle the Javascript event which is sent to Swift :

    func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage)
        {
            if(message.name == "callbackHandler") {
                print("Launch my Native Camera")
            }
        }
    

    ... And finally, my Javascript (jQuery) code when a click happens on my camera button (in HTML) :

    $(document).ready(function() {
    
        function callNativeApp () {
            try {
                webkit.messageHandlers.callbackHandler.postMessage("camera");
            } catch(err) {
                console.log('The native context does not exist yet');
            }
        }
    
        $(".menu-camera-icon").click(function() {
            callNativeApp();
        });
    });
    

    I hope it will help someone else :-) !