アプリ内メッセージ¶
アプリ内メッセージはSDKをインストールするだけで利用できます。表示タイミングはメッセージ作成時に メッセージ表示トリガー で指定してください。
ただし以下のケースに当てはまる場合、実装の追加/変更を行う必要があります。
実装の追加/変更が必要なケース¶
アプリ起動時にスプラッシュスクリーンを表示したり画面遷移をしている場合¶
アプリの実装がこのケースの場合、アプリ内メッセージの表示トリガーを「アプリ起動」にした際にメッセージがうまく表示されないことがあります。
この場合、以下の手順でSDK APIを利用して起動時のアプリ内メッセージの表示タイミングをずらすことが可能です。
ご利用中のSDKバージョンが5以上の場合¶
まず、 disableInAppMessagesOnForegroundTransition を 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");
...
}
}
import io.repro.android.Repro
...
class MyApplication : Application() {
override fun 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");
...
}
さらに、スプラッシュスクリーンの表示が終わったタイミングで enableInAppMessagesOnForegroundTransition を呼び出してください。
[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);
// activity not necessary for Android SDK 5.24.0 Later
Repro.enableInAppMessagesOnForegroundTransition();
...
}
}
import io.repro.android.Repro
class MyActivity : Activity() {
protected fun someFunc() {
...
// you should pass current visible activity to enableInAppMessagesOnForegroundTransition()
//Repro.enableInAppMessagesOnForegroundTransition(this)
// activity not necessary for Android SDK 5.24.0 Later
Repro.enableInAppMessagesOnForegroundTransition()
...
}
}
ReproCpp::enableInAppMessagesOnForegroundTransition();
Repro.EnableInAppMessagesOnForegroundTransition();
Repro.enableInAppMessagesOnForegroundTransition();
Repro.enableInAppMessagesOnForegroundTransition();
await Repro.enableInAppMessagesOnForegroundTransition();
注釈
disableInAppMessagesOnForegroundTransition は、アプリ起動時にスプラッシュスクリーンを採用している場合に活用することを想定した「アプリ起動」イベント専用のメソッドです。 「アプリ起動」以外のイベントが表示トリガーであるメッセージを表示するタイミングの制御をすることはできません。
警告
Android SDK 5.24.0 より enableInAppMessagesOnForegroundTransition は、引数の Activity が不要になりました。引数ありの enableInAppMessagesOnForegroundTransition はそのまま使用可能ですが、 Deprecated となります。引数なしの enableInAppMessagesOnForegroundTransition をご利用ください。
ご利用中のSDKバージョンが5未満の場合¶
まず、 disableInAppMessageOnActive を 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");
...
}
}
import io.repro.android.Repro
...
class MyApplication : Application() {
override fun 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.
さらに、メッセージを表示しても問題ないタイミングで showInAppMessage を呼び出してください。
[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);
...
}
}
import io.repro.android.Repro
class MyActivity : Activity() {
protected fun 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.
注釈
disableInAppMessageOnActive は、アプリ起動時にスプラッシュスクリーンを採用している場合に活用することを想定した「アプリ起動」イベント専用のメソッドです。 「アプリ起動」以外のイベントが表示トリガーであるメッセージを表示するタイミングの制御をすることはできません。
アプリ起動直後に実行されるイベント(「アプリ起動」以外)をアプリ内メッセージの表示トリガーに利用する場合¶
SDKはアプリフォアグラウンド後に表示すべきアプリ内メッセージの情報をサーバから取得します。 このためアプリ起動直後(例えばAndroidの場合、1つ目のActivityのonResumeなど)では情報取得が完了しておらず、メッセージが表示されない可能性があります。
この場合は、アプリ内メッセージの表示トリガーを「アプリ起動」に変更するか、当該イベントの実行を遅延させるなどをご検討ください。
画面遷移前後に実行されるイベントをアプリ内メッセージの表示トリガーに利用する場合¶
画面遷移前後にアプリ内メッセージを表示しようとすると、描画タイミングの影響によりメッセージが表示されない可能性があります。
以下の表を参考に、アプリ内メッセージの表示トリガーに利用するイベントの実装箇所を見直しください。
iOS
実行タイミング |
ダイアログ、オーバーレイ |
バナー |
|---|---|---|
viewDidLoad |
× |
× |
viewWillAppear |
◯ |
◯ |
viewDidAppear |
○ |
◯ |
viewWillDisappear |
◯ |
◯ |
viewDidDisappear |
○ |
× |
Android
実行タイミング |
ダイアログ、オーバーレイ |
バナー |
|---|---|---|
onCreate |
× |
× |
onStart |
× |
× |
onResume |
○ |
◯ |
onPause |
× |
× |
onStop |
○ |
◯ |
onDestroy |
○ |
◯ |
onRestart |
× |
× |
警告
Androidはアプリ内メッセージを表示する時点でresumeの状態であるActivityがなければメッセージを表示できません。
カスタムURL Schemeを使用する場合¶
カスタムURL Schemeのスキーム部分は小文字で指定してください。 HTMLアプリ内メッセージで表示したボタンにカスタムURL Schemeを使用して遷移するときに、スキーム部分が自動的に小文字に変換されて処理されます。 変換された結果、スキームが一致しない問題が発生する可能性がありますのでご注意ください。
ユニバーサルリンク/アプリリンクを使用する場合¶
端末に表示されたプッシュ通知およびアプリ内メッセージに設定されたリンクをタップした際に実行されるURLには、ユニバーサルリンク(またはアプリリンクと呼ばれる)を指定することが可能です。 (簡単のため、以下ではこれらをユニバーサルリンクと呼びます)
アプリにてユニバーサルリンクの実行時の処理を追加するには、以下の通り実装を行う必要があります。 (ここで設定された動作は、プッシュ通知およびアプリ内メッセージ対し有効となります。)
ユニバーサルリンクのURLパターンを登録する¶
ユニバーサルリンクを利用するためには、まずユニバーサルリンクのURLのパターン(正規表現)を指定する必要があります。
注釈
パターン(正規表現)に合致すると、プッシュ通知の開封時や、アプリ内メッセージの遷移先に設定されたURLに対して、後述のコールバック処理をキックします。
また、アプリ内メッセージでHTMLコンテンツを表示するとき、そのコンテンツ内で発生したリクエストに対してもユニバーサルリンクの判定が行われます。
この指定は、iOSの場合は AppDelegate または .plist ファイル、Androidの場合は Application 継承クラス または AndroidManifest.xml ファイルのどちらか一方に記述することで行うことができます。
// 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>
// MyApplication.kt
import io.repro.android.Repro
class MyApplication : Application() {
override fun 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.
警告
ユニバーサルリンクとして設定するURLパターンは、可能な限り ドメインとパスまで含めて具体的に指定 し、 全て小文字で指定 してください。
もし、 https のようにスキームのみを指定した場合、アプリ内メッセージで表示された画面内で実行されたスクリプトなどによるリクエストもユニバーサルリンクと誤って判定され、意図しないタイミングでコールバック処理が実行される可能性があります。
また、URLパターンのスキーム/ドメイン部分に大文字を使用した場合、HTMLアプリ内メッセージで表示したボタンからユニバーサルリンクを使って遷移させようとするときに、スキーム/ドメイン部分が自動的に小文字に変換されて処理されます。パターン(正規表現)に一致せず、意図したタイミングでコールバック処理が実行されない可能性があります。
ユニバーサルリンク実行時の処理を登録する¶
次に、ユニバーサルリンクが実行された際に動作するコールバック処理を実装します。 処理内には、例えばURLのパターンに応じて画面遷移を行う動作などを記述します。
#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);
...
}
...
}
import io.repro.android.Repro
class MyApplication : Application() {
override fun 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 { uri ->
// ** This callback method is executed in the main thread **
if (uri.host == "example.com") {
// 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, ...
}
});
注釈
Cocos2d-xをご利用の場合のみ、別途ブリッジ処理の実装が必要です。 実装方法の詳細は ブリッジクラスの追加 を参照してください。
App-Bound Domains を有効にしている場合(iOSのみ)¶
iOS の App-Bound Domains を有効にしている場合、そのままでは HTMLアプリ内メッセージ が表示されません。
HTMLアプリ内メッセージ を表示するためには、以下の対応を行う必要があります。
iOS SDKバージョン5.22.0以上にアップデートしてください
App-Bound Domains のリストに https://io.repro.repro を追加するか、アプリの
Info.plistファイルにRPRHtmlInAppBaseUrlを追加し、 App-Bound Domains で利用中のURLを指定してください
以下はアプリの Info.plist ファイルに RPRHtmlInAppBaseUrl を追加するサンプルコードです。
<dict>
...
<key>RPRHtmlInAppBaseUrl</key>
<string>https://example.com</string>
</dict>
ディープリンク経由で指定のアプリ内メッセージを表示する場合¶
ディープリンク経由でアプリが起動した際に、指定のアプリ内メッセージを表示することが可能です。
この場合、ディープリンクのURLを deepLinkReceived に渡す実装が必要です。URLのクエリ(URLの ? より後ろの文字列)に reproEventKey というパラメータが存在する場合、SDKはその値をイベント名としたイベントトラッキングを行います。そのイベントを メッセージ表示トリガー に設定したアプリ内メッセージが、アプリ起動時に表示されます。
ディープリンクを使ってアプリを起動する処理自体は、Repro SDKとは関係なくアプリ側で実装されているものです。以下では、その実装に deepLinkReceived の呼び出しを追加する方法を、ディープリンクの種類(カスタムURL Scheme、ユニバーサルリンク/アプリリンク、プッシュ通知)ごとに説明します。
警告
本機能の利用には、Repro iOS SDK 5.24.0 以上、Repro Android SDK 5.23.0 以上が必要です。
イベントプロパティを利用する場合 は、Repro iOS SDK 5.25.0 以上、Repro Android SDK 5.25.0 以上が必要です。
注釈
Adjust/AppsFlyerの deferred deep linking での利用は推奨しません。
deferred deep linkingは、アプリをストアからインストールしてアプリを起動した際、過去にディープリンクを実行している場合にディープリンクに付与されているパラメータを受け渡すものです。
本機能もそのパラメータを受け取り、パラメータを使ってアプリ内メッセージを表示することはできますが、そのパラメータを受け取るために2〜5秒程度の遅延が発生します。
そのため、アプリの操作中に意図しないタイミングでアプリ内メッセージが表示される可能性があります。
共通¶
本機能は、アプリに実装されたディープリンクのURLを deepLinkReceived というメソッドの引数に渡すことで実現しています。ディープリンクのURLが取得できる箇所で deepLinkReceived を呼び出してURLを渡してください。
deepLinkReceived に渡されたURLのクエリから reproEventKey というパラメータ名を探し、その名前が存在する場合に値を文字列として受け取り、その値をイベント名にしたReproのイベントトラッキングが発生します。アプリ内メッセージは、そのイベントを表示トリガーに設定している場合に表示されます。
URL例¶
myapp://example/aaa?reproEventKey=イベント名
https://example.com/aaa?reproEventKey=イベント名
管理画面設定例¶
イベント名を beforeOnloadEvent とする場合、アプリ内メッセージの メッセージ表示トリガー を以下のように設定します。
注釈
メッセージ表示トリガーに選択可能なイベントを表示するには、過去に一度でもそのイベントがトラッキングされている必要があります。
イベントプロパティを利用する場合¶
本機能は、イベントの発火に合わせてイベントプロパティを付与することが可能です。
イベントプロパティの付与方法は二種類あり、 reproEventPropertyKey と reproEventPropertyValue をそれぞれ指定して渡す方法と、 reproEventPropertyJson にJSON Stringを渡す方法があります。どちらも設定された場合は、JSON Stringが優先されます。
警告
イベントプロパティを利用するには、Repro iOS SDK 5.25.0 以上、Repro Android SDK 5.25.0 以上が必要です。
URL例¶
myapp://example/aaa?reproEventKey=イベント名&reproEventPropertyKey=イベントプロパティKey&reproEventPropertyValue=イベントプロパティValue
https://example.com/aaa?reproEventKey=イベント名&reproEventPropertyKey=イベントプロパティKey&reproEventPropertyValue=イベントプロパティValue
myapp://example/aaa?reproEventKey=イベント名&reproEventPropertyJson=KeyValueが設定されたJSON String
https://example.com/aaa?reproEventKey=イベント名&reproEventPropertyJson=KeyValueが設定されたJSON String
reproEventPropertyJson に渡すJSON Stringの例は以下の通りです。URLのクエリに含める際は、URLエンコードしてください。
// Example JSON string
{"couponId": "1234", "campaign": "summer_sale"}
// Example URL with the JSON string URL-encoded in the query
myapp://example/aaa?reproEventKey=openCoupon&reproEventPropertyJson=%7B%22couponId%22%3A%221234%22%2C%22campaign%22%3A%22summer_sale%22%7D
iOSでの実装方法¶
カスタムURL Schemeを利用する場合¶
カスタムURL Schemeで本機能を利用する場合、URLを取得する部分で deepLinkReceived を記述してURLを渡してください。
以下はSwiftUIのサンプルコードに deepLinkReceived を受け渡す部分を記載したものです。 AppDelegate や SceneDelegate を利用している場合は、適宜読み替えてください。
// SceneDelegate.m
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
{
NSURL *url = URLContexts.anyObject.URL;
[Repro deepLinkReceived:url]; // <= Add this line
// Screen routing
if ([url.path isEqualToString:@"/XXXX"]) {
...
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// Modifier called when the app is opened via a URL
.onOpenURL { url in
handleIncomingURL(url)
}
}
}
/// Parse the URL and navigate to the appropriate screen
func handleIncomingURL(_ url: URL) {
Repro.deepLinkReceived(url: url) // <= Add this line
// Screen routing
if url.path == "/XXXX" {
...
}
}
}
// This section explains the implementation in iOS.
// Please change the language to Objective-C or Swift.
// This section explains the implementation in iOS.
// Please change the language to Objective-C or Swift.
ユニバーサルリンクを利用する場合¶
ユニバーサルリンクで本機能を利用する場合もカスタムURL Schemeで利用する場合と同様、URLを取得する部分で deepLinkReceived を記述してURLを渡してください。
// AppDelegate.m
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *))restorationHandler
{
NSURL *url = userActivity.webpageURL;
[Repro deepLinkReceived:url]; // <= Add this line
// Screen routing
if ([url.path isEqualToString:@"/XXXX"]) {
...
}
return YES;
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
// Handle a detected Universal Link
handleUniversalLink(url)
}
}
}
func handleUniversalLink(_ url: URL) {
Repro.deepLinkReceived(url: url) // <= Add this line
// Screen routing
if url.path == "/XXXX" {
...
}
}
}
// This section explains the implementation in iOS.
// Please change the language to Objective-C or Swift.
// This section explains the implementation in iOS.
// Please change the language to Objective-C or Swift.
プッシュ通知を利用する場合¶
プッシュ通知を開いた時にディープリンクのURLを渡したい場合は、Reproの機能である ユニバーサルリンク を使用してください。プッシュ通知を配信する際のディープリンクの項目(以下画像)とユニバーサルリンクのURLパターンがマッチした場合、自動でURLが deepLinkReceived に渡されます。すでにURLパターンに登録されている場合、追加の実装は不要です。
取得するパラメータ名を変更する¶
Reproが取得するパラメータのキーは、デフォルトでは reproEventKey となっていますが、このキー名を変更することが可能です。
iOSでキー名を変更する場合は、対象のアプリの Info.plist に以下の仕様でキーと値を追加してください。
Key (キー名) |
Type (型) |
Value (値) |
|---|---|---|
|
String |
変更したいキー名 |
ソースコードでの追加方法は以下の通りです。
<key>RPRDeepLinkCustomParamKey</key>
<string>変更したいキー名</string>
Androidでの実装方法¶
カスタムURL Schemeを利用する場合¶
カスタムURL Schemeで本機能を利用する場合、URLを取得する部分で deepLinkReceived を記述してURLを渡してください。
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Handle the case where the app is launched freshly
handleIntent(getIntent());
}
// Handle the case where the app is already running in the background
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
// Check whether the Intent action is VIEW (launched from a URL)
if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String path = uri.getPath();
Repro.deepLinkReceived(getApplication(), uri); // <= Add this line
// Routing
if ("/XXXX".equals(path)) {
...
}
}
}
}
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Handle the case where the app is launched freshly
handleIntent(intent)
}
// Handle the case where the app is already running in the background
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
// Check whether the Intent action is VIEW (launched from a URL)
if (Intent.ACTION_VIEW == intent?.action) {
val uri = intent.data
val path = uri.path
Repro.deepLinkReceived(application, uri) // <= Add this line
// Routing
if (path == "/XXXX") {
...
}
}
}
}
// This section explains the implementation in Android.
// Please change the language to Java or Kotlin.
// This section explains the implementation in Android.
// Please change the language to Java or Kotlin.
アプリリンクを利用する場合¶
アプリリンク(App Links)で本機能を利用する場合もカスタムURL Schemeで利用する場合と同様、URLを取得する部分で deepLinkReceived を記述してURLを渡してください。
プッシュ通知を利用する場合¶
プッシュ通知を開いた時にディープリンクのURLを渡したい場合は、Reproの機能である ユニバーサルリンク を使用してください。プッシュ通知を配信する際のディープリンクの項目(以下画像)とユニバーサルリンクのURLパターンがマッチした場合、自動でURLが deepLinkReceived に渡されます。すでにURLパターンに登録されている場合、追加の実装は不要です。
取得するパラメータ名を変更する¶
Reproが取得するパラメータのキーは、デフォルトでは reproEventKey となっていますが、このキー名を変更することが可能です。
Androidでキー名を変更する場合は、対象のアプリの AndroidManifest.xml に以下の仕様でキーと値を追加してください。
android:name (キー名) |
android:value (値) |
|---|---|
|
変更したいキー名 |
XMLでの追加方法は以下の通りです。
<meta-data
android:name="io.repro.android.RPRDeepLinkCustomParamKey"
android:value="変更したいキー名">
</meta-data>
React Native/Expo/Flutter/Cordova/Monaca/Unity/Cocos2d-x¶
ご利用のプラットフォームでも、ディープリンクを用いたアプリ起動の実装は可能です。
なお、本機能によってアプリ起動時にアプリ内メッセージを表示するには、ネイティブ環境(iOS/Android)と同等の実装が必要となります。 iOSでの実装方法 および Androidでの実装方法 を確認し、必要に応じてiOSの AppDelegate やAndroidの MainActivity への処理追加を行ってください。