Links

Native handling of JavaScript events

iOS
Android
You can handle events from in-app message interactions natively within your application by completing the following steps:

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.

Register a JavaScript handler for your In-App Message

In the shouldShowMessage function of the MessagingDelegate, call handleJavascriptMessage(_:withHandler) to register your handler.
The name of the message you intend to pass from the JavaScript side should be specified in the first parameter.
The following example shows a handler that dispatches an inapp.interact Experience Event natively when the JavaScript of the in-app message posts a myInappCallback message:
Swift
func shouldShowMessage(message: Showable) -> Bool {
let fullscreenMessage = message as? FullscreenMessage
let message = fullscreenMessage?.parent
// in-line handling of JavaScript calls
message?.handleJavascriptMessage("myInappCallback") { content
print("JavaScript body passed to native callback: \(content ?? "empty")")
message?.track(content as? String, withEdgeEventType: .inappInteract)
}
return true
}
You can handle events from in-app message interactions natively within your application by completing the following steps:

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.

Register a JavaScript handler for your In-App Message

In the shouldShowMessage function of the MessagingDelegate, call public void handleJavascriptMessage(final String name, final AdobeCallback<String> callback) to register your handler.
The name of the message you intend to pass from the JavaScript side should be specified in the first parameter.
The following example shows a handler that dispatches an inapp.interact Experience Event natively when the JavaScript of the in-app message posts a myInappCallback message:
Java
@Override
public boolean shouldShowMessage(FullscreenMessage fullscreenMessage) {
Message message = (Message) fullscreenMessage.getParent();
// in-line handling of JavaScript calls
message.handleJavascriptMessage("myInappCallback", new AdobeCallback<String>() {
@Override
public void call(String content) {
System.out.println("JavaScript body passed to native callback: " + content);
message.track(content, MessagingEdgeEventType.IN_APP_INTERACT);
}
});
}

Post the JavaScript message from your In-App Message

Now that the in-app message has been displayed, the final step is to post the JavaScript message.
Continuing from the previous example, the developer is going to post the myInappCallback message from their HTML, which will in turn call the handler previously configured:

HTML

<html>
<head>
<script type="text/javascript">
function callNative(action) {
try {
// the name of the message handler is the same name that must be registered in native code.
// in this case the message name is "myInappCallback"
webkit.messageHandlers.myInappCallback.postMessage(action);
} catch(err) {
console.log('The native context does not exist yet'); }
}
</script>
</head>
<body>
<button onclick="callNative('native callbacks are cool!')">Native callback!</button>
</body>
</html>
(The above HTML is not representative of a valid in-app message, and is intended only to demonstrate how to post the JavaScript message).
When the user clicks the button inside of this in-app message, the handler configured in the previous step will be called. The handler will send an Experience Event tracking the interaction, and print the following message to the console:
JavaScript body passed to native callback: native callbacks are cool!

Examples

The test apps in AEPMessaging GitHub repository demonstrate using a MessagingDelegate: