Execute JavaScript methods from native code
You can execute JavaScript in an in-app message from native code by completing the following steps:
- Implement and assign a
MessagingDelegate
- Obtain a reference to the web view
- Call the JavaScript method
Implement and assign a MessagingDelegate
To register a JavaScript event handler with a Message
object, you will first need to implement and set a MessagingDelegate
.
For more detailed instructions on implementing and using a MessagingDelegate, please read the tutorial on using MessagingDelegate.
Obtain a reference to the web view
In the shouldShowMessage
function of the MessagingDelegate
, get a reference to the web view used by the message.
On Android, the web view is represented as WebView
.
Java
Copied to your clipboard@Overridepublic boolean shouldShowMessage(FullscreenMessage fullscreenMessage) {// access to the whole message from the parentMessage message = (Message) fullscreenMessage.getParent();WebView webView = message.getWebView();...}
On iOS, the web view is represented as WKWebView
.
Swift
Copied to your clipboardfunc shouldShowMessage(message: Showable) -> Bool {// access to the whole message from the parentlet fullscreenMessage = message as? FullscreenMessagelet message = fullscreenMessage?.parentlet messageWebView = message?.view as? WKWebView...}
On Android, the web view is represented as WebView
.
Java
Copied to your clipboard@Overridepublic boolean shouldShowMessage(FullscreenMessage fullscreenMessage) {// access to the whole message from the parentMessage message = (Message) fullscreenMessage.getParent();WebView webView = message.getWebView();...}
On iOS, the web view is represented as WKWebView
.
Swift
Copied to your clipboardfunc shouldShowMessage(message: Showable) -> Bool {// access to the whole message from the parentlet fullscreenMessage = message as? FullscreenMessagelet message = fullscreenMessage?.parentlet messageWebView = message?.view as? WKWebView...}
Call the JavaScript method
With a reference to the WebView
, the instance method public void evaluateJavascript(@NonNull String script, @Nullable ValueCallback<String> resultCallback)
can now be leveraged to call a JavaScript method.
Further details of this API are explained in the Android documentation - the example below is provided for the purpose of demonstration:
Java
Copied to your clipboard@Overridepublic boolean shouldShowMessage(FullscreenMessage fullscreenMessage) {// access to the whole message from the parentMessage message = (Message) fullscreenMessage.getParent();WebView webView = message.getWebView();// webview operations must be run on the ui threadwebView.post(new Runnable() {@Overridepublic void run() {webView.evaluateJavascript("startTimer()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String s) {// do something with the content}});}});...}
With a reference to the WKWebView
, the instance method evaluateJavaScript(_:completionHandler:)
can now be leveraged to call a JavaScript method.
Further details of this API are explained in the Apple documentation - the example below is provided for the purpose of demonstration:
Swift
Copied to your clipboardfunc shouldShowMessage(message: Showable) -> Bool {// access to the whole message from the parentlet fullscreenMessage = message as? FullscreenMessagelet message = fullscreenMessage?.parent// the `shouldShowMessage` delegate method is called on a background thread.// need to dispatch code that uses the webview back to the main thread.DispatchQueue.main.async {let messageWebView = message?.view as? WKWebViewmessageWebView?.evaluateJavaScript("startTimer();") { result, error inif error != nil {// handle errorreturn}if result != nil {// do something with the result}}}...}
With a reference to the WebView
, the instance method public void evaluateJavascript(@NonNull String script, @Nullable ValueCallback<String> resultCallback)
can now be leveraged to call a JavaScript method.
Further details of this API are explained in the Android documentation - the example below is provided for the purpose of demonstration:
Java
Copied to your clipboard@Overridepublic boolean shouldShowMessage(FullscreenMessage fullscreenMessage) {// access to the whole message from the parentMessage message = (Message) fullscreenMessage.getParent();WebView webView = message.getWebView();// webview operations must be run on the ui threadwebView.post(new Runnable() {@Overridepublic void run() {webView.evaluateJavascript("startTimer()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String s) {// do something with the content}});}});...}
With a reference to the WKWebView
, the instance method evaluateJavaScript(_:completionHandler:)
can now be leveraged to call a JavaScript method.
Further details of this API are explained in the Apple documentation - the example below is provided for the purpose of demonstration:
Swift
Copied to your clipboardfunc shouldShowMessage(message: Showable) -> Bool {// access to the whole message from the parentlet fullscreenMessage = message as? FullscreenMessagelet message = fullscreenMessage?.parent// the `shouldShowMessage` delegate method is called on a background thread.// need to dispatch code that uses the webview back to the main thread.DispatchQueue.main.async {let messageWebView = message?.view as? WKWebViewmessageWebView?.evaluateJavaScript("startTimer();") { result, error inif error != nil {// handle errorreturn}if result != nil {// do something with the result}}}...}
Examples
The test apps in this repository demonstrate executing JavaScript code from an in-app message's webview: