アプリ内メッセージをトリガーする
Braze SDKを通じてアプリ内メッセージをトリガーする方法を説明します。
メッセージのトリガーと配信
アプリ内メッセージは、SDKが以下のカスタムイベントタイプのいずれかをログに記録したときにトリガーされます: Session Start、Push Click、Any Purchase、Specific Purchase、Custom Event(最後の2つは堅牢なプロパティフィルターを含みます)。
ユーザーのセッション開始時に、Brazeは対象となるすべてのアプリ内メッセージをユーザーのデバイスに配信し、同時にアセットをプリフェッチして表示レイテンシーを最小化します。トリガーイベントに複数の適格なアプリ内メッセージがある場合、最も優先度の高いメッセージのみが配信されます。詳しくはセッションライフサイクルを参照してください。
アプリ内メッセージは、APIまたはAPIイベントによってトリガーすることはできません。SDKによってログに記録されるカスタムイベントによってのみトリガーされます。ロギングの詳細については、カスタムイベントのログ記録を参照してください。
アプリ内メッセージのタイプ
Brazeは、セッション開始時にユーザーのデバイスに以下のタイプのアプリ内メッセージを送信します: inappとtemplated_iam。ダッシュボードユーザーとしては異なるタイプを目にすることはありませんが、Brazeはセットアップとコンテンツに応じてそれらを異なる方法で処理します。
inapp(標準)
inapp(または「標準」)アプリ内メッセージは、Brazeがすでに把握しているカスタム属性などの必要な情報がすでにテンプレート化されています。一般的に、アプリ内メッセージがデバイスにダウンロードされると、デバイスがオフラインまたは機内モードであっても、トリガーイベントによってSDKがinappアプリ内メッセージを表示します。
templated_iam(テンプレート化)
templated_iam(または「テンプレート化」)アプリ内メッセージは、まだ必要な情報がテンプレート化されていません。メッセージが表示される前に、Brazeは情報を取得するために別のリクエストを行う必要があります。
アプリ内メッセージは、表示前にCampaignの適格性を再評価するが選択されている場合、またはメッセージに以下のいずれかのLiquidタグが含まれている場合、テンプレート化されたアプリ内メッセージとして配信されます。
canvas_entry_propertiesconnected_content{sms.${*}}などのSMS変数catalog_itemscatalog_selection_itemsevent_properties
これは、セッション開始時にデバイスがアプリ内メッセージ全体ではなく、そのアプリ内メッセージのトリガーを受信することを意味します。ユーザーがアプリ内メッセージをトリガーすると、ユーザーのデバイスが実際のメッセージを取得するためにネットワークリクエストを行います。
デバイスがインターネットにアクセスできない場合、メッセージは配信されません。Liquidロジックの解決に時間がかかりすぎる場合も、メッセージが配信されないことがあります。
キーと値のペア
BrazeでCampaignを作成する際、キーと値のペアをextrasとして設定できます。アプリ内メッセージングオブジェクトはこれを使用してアプリにデータを送信できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import * as braze from "@braze/web-sdk";
braze.subscribeToInAppMessage(function(inAppMessage) {
// control group messages should always be "shown"
// this will log an impression and not show a visible message
if (inAppMessage instanceof braze.ControlMessage) {
return braze.showInAppMessage(inAppMessage);
}
if (inAppMessage instanceof braze.InAppMessage) {
const extras = inAppMessage.extras;
if (extras) {
for (const key in extras) {
console.log("key: " + key + ", value: " + extras[key]);
}
}
}
braze.showInAppMessage(inAppMessage);
});
1
Map<String, String> getExtras()
1
extras: Map<String, String>
次の例では、カスタムロジックを使用して、extrasのキーと値のペアに基づいてアプリ内メッセージの表示を設定します。完全なカスタマイズ例については、サンプルアプリを参照してください。
1
2
3
4
let customization = message.extras["custom-display"] as? String
if customization == "colorful-slideup" {
// Perform your custom logic.
}
1
2
3
4
5
6
if ([message.extras[@"custom-display"] isKindOfClass:[NSString class]]) {
NSString *customization = message.extras[@"custom-display"];
if ([customization isEqualToString:@"colorful-slideup"]) {
// Perform your custom logic.
}
}
自動トリガーを無効にする
デフォルトでは、アプリ内メッセージは自動的にトリガーされます。これを無効にするには:
読み込みスニペット内のbraze.automaticallyShowInAppMessages()への呼び出しを削除し、アプリ内メッセージの表示/非表示を処理するカスタムロジックを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
braze.subscribeToInAppMessage(function(inAppMessage) {
// control group messages should always be "shown"
// this will log an impression and not show a visible message
if (inAppMessage.isControl) { // v4.5.0+, otherwise use `inAppMessage instanceof braze.ControlMessage`
return braze.showInAppMessage(inAppMessage);
}
// Display the in-app message. You could defer display here by pushing this message to code within your own application.
// If you don't want to use the display capabilities in Braze, you could alternatively pass the in-app message to your own display code here.
if ( should_show_the_message_according_to_your_custom_logic ) {
braze.showInAppMessage(inAppMessage);
} else {
// do nothing
}
});
braze.automaticallyShowInAppMessages()を削除せずにbraze.showInAppMessageを呼び出すと、メッセージが2回表示される場合があります。
メッセージのタイミングをより高度にコントロールする方法(トリガーメッセージの遅延や復元を含む)については、チュートリアル: トリガーメッセージの遅延と復元を参照してください。
- カスタムリスナーを設定するために
IInAppMessageManagerListenerを実装します。 beforeInAppMessageDisplayed()メソッドを更新して、InAppMessageOperation.DISCARDを返すようにします。
メッセージのタイミングをより高度にコントロールするには(後から表示や再キューイングを含む)、メッセージのカスタマイズページを参照してください。
- アプリに
BrazeInAppMessageUIDelegateデリゲートを実装します。完全な手順については、チュートリアル: アプリ内メッセージUIを参照してください。 inAppMessage(_:displayChoiceForMessage:)デリゲートメソッドを更新して.discardを返すようにします。
メッセージのタイミングをより高度にコントロールする方法(トリガーメッセージの遅延や復元を含む)については、チュートリアル: トリガーメッセージの遅延と復元を参照してください。
- 自動統合初期化機能を使用していることを確認してください。この機能は、バージョン
2.2.0以降でデフォルトで有効になっています。 - 次の行を
braze.xmlファイルに追加することで、アプリ内メッセージ操作のデフォルトをDISCARDに設定します。1
<string name="com_braze_flutter_automatic_integration_iam_operation">DISCARD</string>
Androidの場合、Braze設定エディターでAutomatically Display In-App Messagesの選択を解除します。または、Unityプロジェクトのbraze.xmlでcom_braze_inapp_show_inapp_messages_automaticallyをfalseに設定できます。
アプリ内メッセージの初期表示動作は、Braze設定の「In App Message Manager Initial Display Operation」で設定できます。
iOSの場合、Braze設定エディターでゲームオブジェクトリスナーを設定し、Braze Displays In-App Messagesが選択されていないことを確認します。
アプリ内メッセージの初期表示動作は、Braze設定の「In App Message Manager Initial Display Operation」で設定できます。
1つのセッションで2つのアプリ内メッセージを連鎖させる
セッション開始時にアプリ内メッセージをトリガーし、最初のメッセージでボタンが押された後に2番目のアプリ内メッセージをトリガーできます。これを行うには、2番目のメッセージをトリガーするボタンクリックのカスタムイベントをログに記録します。2番目のメッセージのトリガーはすでにデバイス上にある必要があり(ユーザーはすでに2番目のメッセージの対象である必要があります)、デバイス側で発生する必要があります(Braze SDKはBrazeサーバーで発生するカスタム属性の変更を取得しません)。複数のアプリ内メッセージを素早く連続して表示するには、アプリ内メッセージトリガー間のデフォルトの30秒クールダウンを変更する必要があります。プラットフォーム固有の設定については、デフォルトのレート制限をオーバーライドするを参照してください。
デフォルトのレート制限をオーバーライドする
デフォルトでは、SDKはトリガーされたアプリ内メッセージを30秒に1回にレート制限しています。これをオーバーライドするには、Brazeインスタンスが初期化される前に、以下のプロパティを設定ファイルに追加します。この値は、新しいレート制限(秒単位)として使用されます。
本番アプリでは、ユーザーが連続するアプリ内メッセージに圧倒されないよう、この値を10秒未満に設定しないでください。テストやサンプルアプリのフローでは、5秒が一般的な設定です。
テスト用にこの間隔を0に設定できます。ただし、0秒の間隔は複数のアプリ内メッセージを同時に表示させるものではありません。1つのアプリ内メッセージがすでに表示されている場合、現在のメッセージが閉じられるまで、別のトリガーされたメッセージは表示されません。
1
2
// Sets the minimum time interval between triggered in-app messages to 5 seconds instead of the default 30
braze.initialize('YOUR-API-KEY', { minimumIntervalBetweenTriggerActionsInSeconds: 5 })
1
<integer name="com_braze_trigger_action_minimum_time_interval_seconds">5</integer>
1
2
3
4
5
6
7
8
let configuration = Braze.Configuration(
apiKey: "YOUR-APP-IDENTIFIER-API-KEY",
endpoint: "YOUR-BRAZE-ENDPOINT"
)
// Sets the minimum trigger time interval to 5 seconds
configuration.triggerMinimumTimeInterval = 5
let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
1
2
3
4
5
6
7
BRZConfiguration *configuration =
[[BRZConfiguration alloc] initWithApiKey:@"<BRAZE_API_KEY>"
endpoint:@"<BRAZE_ENDPOINT>"];
// Sets the minimum trigger time interval to 5 seconds
configuration.triggerMinimumTimeInterval = 5;
Braze *braze = [BrazePlugin initBraze:configuration];
AppDelegate.braze = braze;
手動でメッセージをトリガーする
デフォルトでは、アプリ内メッセージはSDKがカスタムイベントを記録したときに自動的にトリガーされます。しかし、これに加えて、以下の方法を使って手動でメッセージをトリガーすることもできます。
サーバー側のイベントを使用する
現時点では、Web Braze SDKはサーバー側のイベントを使用して手動でメッセージをトリガーすることをサポートしていません。
サーバー送信イベントを使用してアプリ内メッセージをトリガーするには、サイレントプッシュ通知をデバイスに送信し、カスタムプッシュコールバックがSDKベースのイベントをログに記録できるようにします。このイベントは、その後ユーザー向けのアプリ内メッセージをトリガーします。
ステップ1: サイレントプッシュを受信するプッシュコールバックを作成する
特定のサイレントプッシュ通知をリッスンするには、カスタムプッシュコールバックを登録します。詳細については、プッシュ通知の設定を参照してください。
アプリ内メッセージが配信されるために2つのイベントが記録されます。1つはサーバーによって記録され、もう1つはカスタムプッシュコールバック内から記録されます。同じイベントが重複しないようにするには、プッシュコールバック内からログに記録されるイベントは、サーバー送信イベントと同じ名前ではなく、「アプリ内メッセージトリガーイベント」などの一般的な命名規則に従う必要があります。そうしないと、単一のユーザーアクションについてログに記録される重複イベントによって、セグメンテーションとユーザーデータが影響を受ける可能性があります。
1
2
3
4
5
6
7
8
9
10
11
Braze.getInstance(context).subscribeToPushNotificationEvents(event -> {
final Bundle kvps = event.getNotificationPayload().getBrazeExtras();
if (kvps.containsKey("IS_SERVER_EVENT")) {
BrazeProperties eventProperties = new BrazeProperties();
// The campaign name is a string extra that clients can include in the push
String campaignName = kvps.getString("CAMPAIGN_NAME");
eventProperties.addProperty("campaign_name", campaignName);
Braze.getInstance(context).logCustomEvent("IAM Trigger", eventProperties);
}
});
1
2
3
4
5
6
7
8
9
10
11
Braze.getInstance(applicationContext).subscribeToPushNotificationEvents { event ->
val kvps = event.notificationPayload.brazeExtras
if (kvps.containsKey("IS_SERVER_EVENT")) {
val eventProperties = BrazeProperties()
// The campaign name is a string extra that clients can include in the push
val campaignName = kvps.getString("CAMPAIGN_NAME")
eventProperties.addProperty("campaign_name", campaignName)
Braze.getInstance(applicationContext).logCustomEvent("IAM Trigger", eventProperties)
}
}
ステップ2: プッシュキャンペーンを作成する
サーバー送信イベントを介してトリガーされるサイレントプッシュキャンペーンを作成します。

プッシュキャンペーンにはキーと値のペアエクストラを含める必要があります。これは、このプッシュキャンペーンがSDKカスタムイベントを記録するために送信されることを示します。このイベントはアプリ内メッセージをトリガーするために使用されます。

前出のプッシュコールバックサンプルコードは、キーと値のペアを認識して、適切なSDKカスタムイベントをログに記録します。
「アプリ内メッセージトリガー」イベントに添付するイベントプロパティを含めるには、プッシュペイロードのキーと値のペアでプロパティを渡します。この例では、後続のアプリ内メッセージのキャンペーン名が含められています。カスタムプッシュコールバックは、カスタムイベントをログに記録するときに、イベントプロパティのパラメーターとして値を渡すことができます。
ステップ3: アプリ内メッセージキャンペーンを作成する
Brazeダッシュボードで、ユーザーに表示されるアプリ内メッセージキャンペーンを作成します。このキャンペーンにはアクションベースの配信が必要であり、カスタムプッシュコールバック内から記録されたカスタムイベントからトリガーされる必要があります。
以下の例では、イベントプロパティを最初のサイレントプッシュの一部として送信することで、トリガーされる特定のアプリ内メッセージが設定されています。

アプリがフォアグラウンドにないときにサーバー送信イベントがログに記録されると、イベントはログに記録されますが、アプリ内メッセージは表示されません。アプリケーションがフォアグラウンドになるまでイベントを遅延させたい場合は、カスタムプッシュレシーバーにチェックを含めて、アプリがフォアグラウンドになるまでイベントを無視または遅延させる必要があります。
ステップ1: サイレントプッシュとキーと値のペアを処理する
次の関数を実装し、application(_:didReceiveRemoteNotification:fetchCompletionHandler:)メソッド内で呼び出します。
1
2
3
4
5
6
func handleExtras(userInfo: [AnyHashable : Any]) {
print("A push was received")
if userInfo != nil && (userInfo["IS_SERVER_EVENT"] as? String) != nil && (userInfo["CAMPAIGN_NAME"] as? String) != nil {
AppDelegate.braze?.logCustomEvent("IAM Trigger", properties: ["campaign_name": userInfo["CAMPAIGN_NAME"]])
}
}
1
2
3
4
5
6
- (void)handleExtrasFromPush:(NSDictionary *)userInfo {
NSLog(@"A push was received.");
if (userInfo !=nil && userInfo[@"IS_SERVER_EVENT"] !=nil && userInfo[@"CAMPAIGN_NAME"]!=nil) {
[AppDelegate.braze logCustomEvent:@"IAM Trigger" properties:@{@"campaign_name": userInfo[@"CAMPAIGN_NAME"]}];
}
};
サイレントプッシュを受信すると、ユーザープロファイルに対してSDKが記録したイベント「アプリ内メッセージトリガー」がログに記録されます。
SDKのログに記録されたカスタムイベントの記録にプッシュメッセージが使用されているため、Brazeはこのソリューションを有効にするために、ユーザーごとにプッシュトークンを格納する必要があります。iOSユーザーの場合、BrazeではユーザーがOSのプッシュプロンプトを受け取った時点からのトークンのみが保存されます。これ以前では、ユーザーはプッシュを使用して到達できず、先行ソリューションも実行できません。
ステップ2: サイレントプッシュキャンペーンを作成する
サーバー送信イベントを介してトリガーされるサイレントプッシュキャンペーンを作成します。

プッシュキャンペーンにはキーと値のペアエクストラを含める必要があります。これは、このプッシュキャンペーンがSDKカスタムイベントを記録するために送信されることを示します。このイベントはアプリ内メッセージをトリガーするために使用されます。

application(_:didReceiveRemoteNotification:fetchCompletionHandler:)メソッド内のコードはキーIS_SERVER_EVENTをチェックし、存在する場合はSDKカスタムイベントをログに記録します。
プッシュペイロードのキーと値のペアエクストラ内で目的の値を送信することで、イベント名またはイベントプロパティのいずれかを変更できます。カスタムイベントを記録する場合、これらのエクストラはイベント名のパラメータまたはイベントプロパティとして使用できます。
ステップ3: アプリ内メッセージキャンペーンを作成する
Brazeダッシュボードで、ユーザーに表示されるアプリ内メッセージキャンペーンを作成します。このキャンペーンにはアクションベースの配信があり、application(_:didReceiveRemoteNotification:fetchCompletionHandler:)メソッド内から記録されたカスタムイベントからトリガーされる必要があります。
以下の例では、イベントプロパティを最初のサイレントプッシュの一部として送信することで、トリガーされる特定のアプリ内メッセージが設定されています。

これらのアプリ内メッセージは、アプリケーションがフォアグラウンドにある間にサイレントプッシュが受信された場合にのみトリガーされます。
事前定義されたメッセージを表示する
事前定義したアプリ内メッセージを手動で表示するには、以下の方法を使用します。
Web SDKでは、braze.showInAppMessage(inAppMessage)を使用してアプリ内メッセージを表示します。詳細と例については、リアルタイムでメッセージを表示するを参照してください。
1
BrazeInAppMessageManager.getInstance().addInAppMessage(inAppMessage);
1
BrazeInAppMessageManager.getInstance().addInAppMessage(inAppMessage)
1
2
3
if let inAppMessage = AppDelegate.braze?.inAppMessagePresenter?.nextAvailableMessage() {
AppDelegate.braze?.inAppMessagePresenter?.present(message: inAppMessage)
}
リアルタイムでメッセージを表示する
ダッシュボードで利用できるのと同じカスタマイズオプションを使って、ローカルのアプリ内メッセージをリアルタイムで作成・表示することもできます。そのためには:
1
2
3
4
// Displays a slideup type in-app message.
var message = new braze.SlideUpMessage("Welcome to Braze! This is an in-app message.");
message.slideFrom = braze.InAppMessage.SlideFrom.TOP;
braze.showInAppMessage(message);
1
2
3
// Initializes a new slideup type in-app message and specifies its message.
InAppMessageSlideup inAppMessage = new InAppMessageSlideup();
inAppMessage.setMessage("Welcome to Braze! This is a slideup in-app message.");
1
2
3
// Initializes a new slideup type in-app message and specifies its message.
val inAppMessage = InAppMessageSlideup()
inAppMessage.message = "Welcome to Braze! This is a slideup in-app message."
ソフトキーボードが画面に表示されているときは、レンダリングが定義されていないため、アプリ内メッセージを表示しないでください。
inAppMessagePresenterでpresent(message:)メソッドを手動で呼び出します。以下に例を示します。
1
2
3
4
let customInAppMessage = Braze.InAppMessage.slideup(
.init(message: "YOUR_CUSTOM_SLIDEUP_MESSAGE", slideFrom: .bottom, themes: .defaults)
)
AppDelegate.braze?.inAppMessagePresenter?.present(message: customInAppMessage)
1
2
3
4
5
6
7
8
9
BRZInAppMessageRaw *customInAppMessage = [[BRZInAppMessageRaw alloc] init];
customInAppMessage.type = BRZInAppMessageRawTypeSlideup;
customInAppMessage.message = @"YOUR_CUSTOM_SLIDEUP_MESSAGE";
customInAppMessage.slideFrom = BRZInAppMessageRawSlideFromBottom;
customInAppMessage.themes = @{
@"light": BRZInAppMessageRawTheme.defaultLight,
@"dark": BRZInAppMessageRawTheme.defaultDark
};
[AppDelegate.braze.inAppMessagePresenter presentMessage:customInAppMessage];
独自のアプリ内メッセージを作成する場合、分析トラッキングをオプトアウトし、message.contextを使用してクリックとインプレッションのロギングを手動で処理する必要があります。
スタックの次のメッセージを表示するには、DisplayNextInAppMessage()メソッドを使用します。DISPLAY_LATERまたはBrazeUnityInAppMessageDisplayActionType.IAM_DISPLAY_LATERがアプリ内メッセージ表示アクションとして選択されている場合、メッセージはこのスタックに保存されます。
1
Appboy.AppboyBinding.DisplayNextInAppMessage();
アプリ内メッセージの遅延の原因
セッション開始後数秒でアプリ内メッセージキャンペーンを受信した場合、遅延は以下の原因で発生した可能性があります:
- キャンペーントリガーの遅延
- カスタマイズ
- トリガーイベントの記録が予想より遅かった場合(
templated_iamの場合など)
Web用Exit-intentメッセージ
Exit-intentメッセージは、訪問者がWebサイトを離れる前に重要な情報を伝えるために使用される、中断のないアプリ内メッセージです。
Web SDKでこれらのメッセージタイプのトリガーを設定するには、Webサイトにexit-intentライブラリ(ouibounceのオープンソースライブラリなど)を実装し、次のコードを使ってBrazeのカスタムイベントとして'exit intent'をログに記録します。これで、今後のアプリ内メッセージキャンペーンでは、このメッセージタイプをカスタムイベントトリガーとして使用できます。
1
2
3
var _ouibounce = ouibounce(false, {
callback: function() { braze.logCustomEvent('exit intent'); }
});