7 アプリ内メッセージ利用方法
アプリ内メッセージはカスタムイベントの付与をトリガーに、ポップアップなどのメッセージを表示させることができる機能です。
アプリ内メッセージ利用手順
- FANSHIP SDK ver6.1.0 以上を導入します
- アプリ上の任意の箇所で「カスタムイベントの付与」を行います
- 配信管理画面より、付与を行ったカスタムイベントを起動トリガーとしてアプリ内メッセージを作成します
- アプリを操作し、対象のカスタムイベントが付与される挙動を行うことでアプリ内メッセージが表示されます
※「コールバッククラス」を利用することで、アプリ内メッセージのボタン押下時の挙動なども制御できます
Warning
アプリ内メッセージは表示をする際に通信を行うという仕様上、通信状況などによって表示が遅れたり、表示に失敗することがあります。
「メッセージが表示されていないとアプリが動かない」等の実装は行わないでください。
7.1 カスタムイベントの付与
カスタムイベントは、アプリ上でのユーザーの挙動などを「イベント」として記録する機能です。
「カスタムイベント(独自イベント)の実装」を参考に、アプリに組み込んでください。
※アプリ内メッセージの実装に必須となります
実装するイベントにつきましては「推奨イベント」をご参考ください。
アプリでカスタムイベントの付与を行うサンプル
「推奨イベント」の app.top、app.first、app.update を付与する際のサンプルとなります。
※アプリの状態を保存するため、SharedPreferences を使用しております。
※アプリの設計に合わせて、onCreate、onRasume などでカスタムイベントの付与を行ってください。
// アプリのトップ画面 Activity
public class MyActivity extends AppCompatActivity {
・・・
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
・・・
// 保存している初回フラグとアプリバージョンを取得
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean isFirst = prefs.getBoolean("APP.FIRST", true);
int versionCode = prefs.getInt("APP.VERSION", 0);
if (isFirst) {
// チュートリアル突破後に初めてトップ画面を開いた場合
Popinfo.trackEvent(this, "app.first", null);
// 初回フラグを false に変更し、現在のバージョンを保存
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("APP.FIRST", false);
editor.putInt("APP.VERSION", BuildConfig.VERSION_CODE);
editor.apply();
} else if (BuildConfig.VERSION_CODE > versionCode) {
// アプリをアップデート後にトップ画面を開いた場合
Popinfo.trackEvent(getApplicationContext(), "app.update", null);
// 現在のバージョンを保存
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("APP.VERSION", BuildConfig.VERSION_CODE);
editor.apply();
} else {
// 通常時、トップ画面を開いた場合
Popinfo.trackEvent(this, "app.top", null);
}
}
・・・
}
Warning
Popinfo.start() と同タイミングでイベントを付与する場合、初回起動時の許諾ダイアログとアプリ内メッセージが両方表示されてしまわないようご注意ください。
7.2 アプリ内メッセージのコールバック
コールバッククラスを利用することでアプリ内メッセージの処理をアプリ側で受け取ることができます。
コールバッククラスを利用するには同梱の PopinfoCallback.java をアプリプロジェクトの任意の名前(ここでは MyPopinfoCallback とします)で任意のパッケージに配置し、AndroidManifest.xml に設定します。
(詳細は「6.3 AndroidManifest.xmlの修正」より<meta-data 一覧>をご確認ください。)
<meta-data
android:name="POPINFO_CALLBACK_CLASS"
android:value="パッケージ名.MyPopinfoCallback" />
画面遷移のサンプル
アプリ内メッセージのボタンが押された際に受け取った URL から画面を遷移するサンプルです。
追加した MyPopinfoCallback へ追記してください。
※アプリ独自の遷移を行う際は事前にカスタムURIスキームの設定が必要となります。
[MyPopinfoCallback.java]
public void onInappMessageTapAction(Context context, String url) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
独自判断のサンプル
アプリ側で独自の要素を含むユーザーに対し、アプリ内メッセージを表示させないようにするというサンプルです。
このアプリ内メッセージは作成する際にカテゴリを指定しております。
[MyPopinfoCallback.java]
// 同時に複数のアプリ内メッセージの条件と一致する可能性があるため、categoryList となっております。
// この判定後にサーバーへ問い合わせを行い、複数一致していた場合は作成時に指定した優先度から表示するメッセージを決定します(同じ優先度の場合は新しく作成されたメッセージ)
public boolean onEventActionTrigger(Context context, String event, List<String> categoryList) {
// アプリで独自に保存している要素を取得
// ※サンプルのため、仮の文字列を入れております
String originalCategory = "xxxxxxx";
for (String category : categoryList) {
if (original.equals(category)) {
return false;
}
}
return true;
}
メッセージ校閲のサンプル
アプリ内メッセージを表示する直前に、メッセージ内容の校閲を行うサンプルです。
このサンプルではアプリ内メッセージに{$user}という内容を指定し、アプリ側で置換をする処理を行っております。
[MyPopinfoCallback.java]
public String onInappMessageUpdate(Context context, String htmlString, String event, String category) {
// アプリで実際に表示をさせる要素を取得
// ※サンプルのため、仮の文字列を入れております
String name = "xxxxxxx";
return htmlString.replace("{$user}", name);
}
7.3 デバッグモードについて
AndroidManifest.xml の meta-data に POPINFO_EVENTACTION_DEBUG を追加することで、イベントトラッキングが付与された際にキー名を Toast で画面上に表示します。
(詳細は「6.3 AndroidManifest.xmlの修正」より<meta-data 一覧>をご確認ください。)
<meta-data
android:name="POPINFO_EVENTACTION_DEBUG"
android:value="true" />
・Toast 表示形式
<キー名> matched. (現在の1日の表示回数,1日の最大表示回数)(トータル表示回数、トータル最大表示回数)
※app.top がマッチした際の例として、下記のように表示され、- は無制限を表します。
<app.top> matched. (1,5)(1,-)
7.4 推奨イベント
アプリでイベントをつける際、推奨するイベントの一覧となります。
※パラメータについては推奨ではありますが必須ではありません
アプリ共通イベント
| イベントタイミング | イベント名 | パラメータ | 備考 |
|---|---|---|---|
| チュートリアル開始時 | app.tutorial_begin | ||
| チュートリアル終了時 | app.tutorial_complete | ||
| チュートリアル突破後、トップ画面に到達 | app.first | トップ画面でユーザーの任意操作が可能になったとき。初回起動判定はアプリ側で行う必要がある | |
| アプリ更新後にトップ画面を開いたとき | app.update | トップ画面でユーザーの任意操作が可能になったとき。アプリ更新判定はアプリ側で行う必要がある | |
| アプリのトップ画面を開いたとき | app.top | トップ画面でユーザーの任意操作を可能になったとき。初回時、更新時と重ならないよう注意 | |
| ログインしたとき | app.login | ログインが完了したあと | |
| 会員登録が完了したとき | app.sign_up | 会員登録が完了したあと | |
| マイページを開いたとき | app.mypage | ユーザー専用のページがある場合 | |
| お気に入り登録をしたとき | app.favorite | お気に入り登録が完了したあと | |
| アプリのお知らせページを開いたとき | app.news | news_id | 任意のお知らせを確認した場合(プッシュ通知とは別) |
| お問い合わせページを開いたとき | app.generate_lead |
ショッピング系アプリ
| イベントタイミング | イベント名 | パラメータ | 備考 |
|---|---|---|---|
| 支払い情報を追加したとき | shop.add_payment_info | ||
| 商品の詳細を確認したとき | shop.detail | item_category, item_name, item_id | |
| 商品をカートに入れたとき | shop.add_to_cart | quantity, item_category, item_name, item_id, item_location_id, value, price, currency | |
| 商品の購入手続きを開始時 | shop.begin_checkout | coupon, currency, value | |
| 商品の購入手続きが完了時 | shop.ecommerce_purchase | coupon,currency,value, tax,shipping, transaction_id | |
| 商品の購入をキャンセルとき | shop.purchase_cancel | item_id, quantity, item_name, price | |
| 払い戻しが行われたとき | shop.purchase_refund | quantity, value, currency, transaction_id | |
| 商品の検索結果を表示したとき | shop.view_search_results | search_term | |
| クーポンのページを開いたとき | shop.coupon_view | coupon_id | |
| クーポンを利用した時 | shop.coupon_use | coupon_id |
鉄道系アプリ
| イベントタイミング | イベント名 | パラメータ | 備考 |
|---|---|---|---|
| 運行状況を確認したとき | train.info | train_line | |
| 乗り換え案内を開いたとき | train.transfer_guide | boarding_station, getting_off_station | |
| 時刻表を確認したとき | train.timetable | train_line | |
| 路線図を確認したとき | train.route_map | train_line | |
| 駅構内図を確認したとき | train.station_map | station | |
| マイ駅設定を追加したとき | train.add_station | station |
推奨イベント付与のサンプル
パラメータが複数のイベントを付与する際は下記のサンプルのように追加してください。
※商品をカートに入れたときのイベントのサンプルとなります。
List<PopinfoEventItem> values = new ArrayList<PopinfoEventItem>();
values.add(new PopinfoEventItem("quantity", "1"));
values.add(new PopinfoEventItem("item_category", "category"));
values.add(new PopinfoEventItem("item_name", "name"));
values.add(new PopinfoEventItem("item_id", "1"));
values.add(new PopinfoEventItem("item_location_id", "1"));
values.add(new PopinfoEventItem("value", "1"));
values.add(new PopinfoEventItem("price", "500"));
values.add(new PopinfoEventItem("currency", "jpy"));
Popinfo.trackEvent(this, "shop.add_to_cart", values);