In-App Message¶
You can start delivering in-app message right after integrating the SDK. Specify the display timing at Trigger by Event when creating the message.
However, if the following cases apply, you need to add / change the implementation.
In case you have to add or change the implementation¶
When a splash screen is presented on app startup or while a screen transition is performed¶
An implementation like this may lead to a not properly displayed in-app messages if the trigger is set to "App Launch".
In this case it is possible to prolong the presentation of in-app messages by using the following SDK API functions.
Repro SDK 5 or above¶
First, call disableInAppMessagesOnForegroundTransition
before setup
.
#import <Repro/Repro.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[Repro disableInAppMessagesOnForegroundTransition];
[Repro setup:@"YOUR_APP_TOKEN"];
...
}
import Repro
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
...
Repro.disableInAppMessagesOnForegroundTransition()
Repro.setup(token: "YOUR_APP_TOKEN")
...
}
import io.repro.android.Repro;
...
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
...
Repro.disableInAppMessagesOnForegroundTransition()
Repro.setup(this, "YOUR_APP_TOKEN");
...
}
}
ReproCpp::disableInAppMessagesOnForegroundTransition();
using UnityEngine;
public class MyBehaviour : MonoBehaviour {
void Start () {
...
Repro.DisableInAppMessagesOnForegroundTransition()
Repro.Setup ("YOUR_APP_TOKEN");
...
}
}
onDeviceReady: function() {
app.receivedEvent('deviceready');
Repro.disableInAppMessagesOnForegroundTransition();
Repro.setup("YOUR_APP_TOKEN");
}
//
// call disableInAppMessageOnActive method in your native code like shown bellow.
//
// iOS(Objective-C): AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Repro disableInAppMessagesOnForegroundTransition];
[Repro setup:@"YOUR_APP_TOKEN"];
...
}
// Android(Java): MainApplication
@Override
public void onCreate() {
super.onCreate();
Repro.disableInAppMessagesOnForegroundTransition()
Repro.setup(this, "YOUR_APP_TOKEN");
...
}
//
// call disableInAppMessagesOnForegroundTransition method in your native code like shown bellow.
//
// iOS(Objective-C): AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[Repro disableInAppMessagesOnForegroundTransition];
[Repro setup:@"YOUR_APP_TOKEN"];
...
}
// Android(Java): MyApplication
@Override
public void onCreate() {
super.onCreate();
Repro.disableInAppMessagesOnForegroundTransition();
Repro.setup(this, "YOUR_APP_TOKEN");
...
}
And call enableInAppMessagesOnForegroundTransition
when the splash screen is closed.
[Repro enableInAppMessagesOnForegroundTransition];
Repro.enableInAppMessagesOnForegroundTransition()
import io.repro.android.Repro;
public class MyActivity extends Activity {
protected void someFunc() {
...
// you should pass current visible activity to enableInAppMessagesOnForegroundTransition()
Repro.enableInAppMessagesOnForegroundTransition(this);
...
}
}
ReproCpp::enableInAppMessagesOnForegroundTransition();
Repro.EnableInAppMessagesOnForegroundTransition();
Repro.enableInAppMessagesOnForegroundTransition();
Repro.enableInAppMessagesOnForegroundTransition();
await Repro.enableInAppMessagesOnForegroundTransition();
Note
disableInAppMessagesOnForegroundTransition is a method dedicated to the "App Launch" event, which is supposed to be used when the splash screen will be presented at the time of application startup. It is not possible to control the display timing of events other than "App Launch".
Repro SDK below version 5¶
First, call disableInAppMessageOnActive
before setup
.
#import <Repro/Repro.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[Repro disableInAppMessageOnActive];
[Repro setup:@"YOUR_APP_TOKEN"];
...
}
import Repro
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
...
Repro.disableInAppMessageOnActive()
Repro.setup(token: "YOUR_APP_TOKEN")
...
}
import io.repro.android.Repro;
...
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
...
Repro.disableInAppMessageOnActive()
Repro.setup(this, "YOUR_APP_TOKEN");
...
}
}
#include "ReproCpp.h"
bool AppDelegate::applicationDidFinishLaunching() {
...
ReproCpp::disableInAppMessageOnActive();
ReproCpp::setup("YOUR_APP_TOKEN");
...
}
using UnityEngine;
public class MyBehaviour : MonoBehaviour {
void Start () {
Repro.DisableInAppMessageOnActive ();
Repro.Setup ("YOUR_APP_TOKEN");
}
}
onDeviceReady: function() {
app.receivedEvent('deviceready');
Repro.disableInAppMessageOnActive();
Repro.setup("YOUR_APP_TOKEN");
}
//
// call disableInAppMessageOnActive method in your native code like shown bellow.
//
// iOS(Objective-C): AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Repro disableInAppMessageOnActive];
[Repro setup:@"YOUR_APP_TOKEN"];
...
}
// Android(Java): MainApplication
@Override
public void onCreate() {
super.onCreate();
Repro.disableInAppMessageOnActive()
Repro.setup(this, "YOUR_APP_TOKEN");
...
}
// Flutter SDK does not support this feature under SDK version 5.
And call showInAppMessage
when the app is ready to display the message.
[Repro showInAppMessage];
Repro.showInAppMessage()
import io.repro.android.Repro;
public class MyActivity extends Activity {
protected void someFunc() {
...
// you should pass current visible activity to showInAppMessage()
Repro.showInAppMessage(this);
...
}
}
ReproCpp::showInAppMessage();
Repro.ShowInAppMessage ();
Repro.showInAppMessage();
Repro.showInAppMessage();
// Flutter SDK does not support this feature under SDK version 5.
Note
disableInAppMessageOnActive is a method dedicated to the "App Launch" event, which is supposed to be used when the splash screen will be presented at the time of application startup. It is not possible to control the display timing of events other than "App Launch".
In case an in-app message trigger (other than "App Launch") is executed immediately after the application has started¶
Since the SDK will load the data for in-app message presentation right after the application enters foreground, depending on network conditions the message may not be presented in the same foreground background cycle.
In this case, please consider changing the display trigger of the in-app message to "App Launch" or delay execution of the event.
When an event executed before or after the screen transition is used as a display trigger for an in-app message¶
If you try to display in-app messages before or after screen transition, there is a possibility that messages may not be displayed due to the influence of draw delay.
Please refer to the table below to see what event will trigger in-app messages.
iOS
Execution timing |
Dialog, Overlay |
Banner |
---|---|---|
viewDidLoad | × | × |
viewWillAppear | ◯ | ◯ |
viewDidAppear | ○ | ◯ |
viewWillDisappear | ◯ | ◯ |
viewDidDisappear | ○ | × |
Android
Execution timing |
Dialog, Overlay |
Banner |
---|---|---|
onCreate | × | × |
onStart | × | × |
onResume | ○ | ◯ |
onPause | × | × |
onStop | ○ | ◯ |
onDestroy | ○ | ◯ |
onRestart | × | × |
Warning
On Android an in-app message can't be display if no activity in resume state is present at the moment of displaying the in-app message.
Using Universal-Links / App-Links¶
It is possible to custom handle the opening of Universal-Links (also called App-Links) when Push Notifications or In-App Messages are tabbed. (For simplification from now only called Universal-Links.)
Please follow the examples below in order to add a custom Universal-Link callback handler which is executed every time an Universal-Link would be opened from a Push-Notification or In-App Message.
How to register a regular expression to match Universal-Links.¶
In order to use Universal-Link callbacks, a regular expression based url matcher must be added. For iOS apps, these matcher regular expressions can be added in the AppDelegate
or in the Apps designated .plist
file. For Android apps your class that extents Application
can be used or if that is not possible, the regular expressions can also be added to your AndroidManifest.xml
file.
// AppDelegate.m
#import <Repro/Repro.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Repro addOpenUrlFilterRegEx:@"https://example\\.com/page/"];
[Repro addOpenUrlFilterRegEx:@"your-domain\\.com/.+\?universal=true"];
...
}
// .plist file
/*
<dict>
<key>RPROpenUrlFilterRegExList</key>
<array>
<string>https://example\.com/page/</string>
<string>your-domain\.com/.+\?universal=true</string>
</array>
...
</dict>
*/
// MyApplication.java
import io.repro.android.Repro;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Repro.addOpenUrlFilterRegEx("https://example\\.com/page/");
Repro.addOpenUrlFilterRegEx("your-domain\\.com/.+\\?universal=true");
...
}
...
}
// AndroidManifest.xml
// To specify multiple URL patterns, enter them separated by commas.
<application>
...
<meta-data
android:name="io.repro.android.OpenUrlFilterRegExList"
android:value="https://example\\.com/page/;your-domain\\.com/.+\\?universal=true">
</meta-data>
</application>
// AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
Repro.add(openUrlFilterRegEx: "https://example\\.com/page/")
Repro.add(openUrlFilterRegEx: "your-domain\\.com/.+\\?universal=true")
...
}
// .plist file
/*
<dict>
<key>RPROpenUrlFilterRegExList</key>
<array>
<string>https://example\.com/page/</string>
<string>your-domain\.com/.+\?universal=true</string>
</array>
...
</dict>
*/
Please follow native iOS and Android instructions in order to add the filters
to the plist/AndroidManifest files or the main AppDelegate/Application classes.
Please follow native iOS and Android instructions in order to add the filters
to the plist/AndroidManifest files or the main AppDelegate/Application classes.
// YourAppNameScene.cpp
bool YourAppName::init() {
ReproCpp::addOpenUrlFilterRegEx("https://example\\.com/page/");
ReproCpp::addOpenUrlFilterRegEx("your-domain\\.com/.+\\?universal=true");
...
}
Please follow native iOS and Android instructions in order to add the filters
to the plist/AndroidManifest files or the main AppDelegate/Application classes.
Please follow native iOS and Android instructions in order to add the filters
to the plist/AndroidManifest files or the main AppDelegate/Application classes.
Adding a callback handler for opening Universal-Links¶
Next a callback handler for custom processing of Universal-Links is added. The URL that was about to be opened is passed to the callback, where then depending on the URL custom code can be executed.
#import <Repro/Repro.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[Repro setOpenUrlCallback:^(NSURL *url) {
if ([url.host isEqualToString:@"example.com"]) {
// In case of your universal link perform navigation, present content, ...
handleUniversalLink(url);
}
}];
...
[Repro setup:@"YOUR_APP_TOKEN"];
...
}
// Set a callback that is executed everytime an URL is about to be opened
Repro.setOpenUrlCallback { url in
if url.host == "example.com" {
// In case of your universal link perform navigation, present content, ...
handleUniversalLink(url)
}
}
...
Repro.setup(token: "YOUR_APP_TOKEN")
...
import io.repro.android.Repro;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// In order to execute a callback when a push notification is tapped,
// the callback must be set in Application, not Activity.
Repro.setOpenUrlCallback(new Repro.OpenUrlCallback() {
// ** This callback method is executed in the main thread **
@Override
public void onOpened(Uri uri) {
if ("example.com".equals(uri.getHost())) {
// In case of your universal link perform navigation, present content, ...
}
}
});
...
Repro.setup(this, YOUR_APP_TOKEN);
...
}
...
}
Repro.setOpenUrlCallback((uri) { // uri is of type Uri
debugPrint("Universal Link Callback Handler received: " + uri.toString());
});
// Somewhere before Repro.Setup(...)
Repro.SetOpenUrlCallback(uri => // uri is of type Uri
{
Debug.Log("Universal Link Callback Handler received: " + uri.ToString());
});
bool YourAppName::init() {
ReproCpp::addOpenUrlFilterRegEx(...);
ReproCpp::setOpenUrlCallback([](const char *url) {
if (strcmp(url, "example.com") == 0) {
// In case of your universal link perform navigation, present content, ...
}
});
ReproCpp::setup("YOUR_APP_TOKEN")
...
}
Repro.setOpenUrlCallback(function(url) { // url is of type String
alert('Universal Link Callback Handler received: ' + url);
if (url.includes("http://example.org")) {
// In case of your universal link perform navigation, present content, ...
}
});
Repro.setOpenUrlCallback( (url) => { // url is of type String
console.log('Universal Link Callback Handler received: ' + url);
if (url.includes("http://example.org")) {
// In case of your universal link perform navigation, present content, ...
}
});
Note
In case you are using Cocos2d-x, an update of one Android bridge file is necessary.For details, please refer to the original installation instructions for adding the bridge code.