Adobe Target リクエストの追加
Adobe Mobile Services SDK(v4)は、ユーザーごとに異なるエクスペリエンスを使用してアプリをパーソナライズできるAdobe Targetの手法と機能を提供します。 通常、パーソナライズされたコンテンツを取得し、そのコンテンツの影響を測定するために、アプリからAdobe Targetに 1 つ以上のリクエストが行われます。
このレッスンでは、Target リクエストを実装して、パーソナライゼーション用の We.Travel アプリを準備します。
前提条件
必ず サンプルアプリをダウンロードして更新してください。
学習目標
このレッスンを終了すると、次の操作を実行できるようになります。
- バッチプリフェッチリクエストを使用して複数の Target オファー(パーソナライズされたコンテンツ)をキャッシュする
- プリフェッチされた Target の場所の読み込み
- リアルタイムでの Target の場所の読み込み(プリフェッチなし)
- プリフェッチされた場所をキャッシュからクリア
- プリフェッチされたリクエストとリアルタイムリクエストの検証
用語
このチュートリアルの残りの部分で使用する、主な Target 用語の一部を以下に示します。
- リクエスト: Adobe Target サーバーへのネットワークリクエスト
- オファー: Target ユーザーインターフェイス(または API を使用)で定義され、応答で配信される、コードまたはその他のテキストベースのコンテンツのスニペット。 通常、ネイティブモバイルアプリで Target を使用する場合は JSON です。
- Location: リクエストに付けられるユーザー定義名。オファーを特定のリクエストに関連付けるために Target インターフェイスで使用されます。
- バッチリクエスト: 複数の場所を含む単一のリクエスト
- プリフェッチリクエスト:オファーを取得し、アプリで今後使用するためにメモリにキャッシュする単一のリクエスト
- バッチプリフェッチリクエスト: 複数の場所のオファーをプリフェッチする単一のリクエスト
- オーディエンス: Target インターフェイスで定義された訪問者、または他のAdobe アプリケーションから Target に共有された訪問者のグループ(「iPhone X の訪問者」、「カリフォルニアの訪問者」、「最初のアプリオープン」など)
- アクティビティ: Target ユーザーインターフェイス(または API を使用)で定義される Target ーディエンス構成で、場所、オファー、オーディエンスをリンクし、パーソナライズされたエクスペリエンスを作成します
バッチ・プリフェッチ・リクエストの追加
We.Travel で最初に実装するリクエストは、ホーム画面の 2 つの Target の場所を持つバッチプリフェッチリクエストです。 後のレッスンでは、これらの場所にオファーを設定します。このオファーでは、新規ユーザーが予約プロセスを進める際に役立つメッセージを表示します。
プリフェッチリクエストは TargetAdobe Target サーバー応答(オファー)をキャッシュすることで、最小限のコンテンツを取得します。 バッチ事前読み込みリクエストは、それぞれ異なる場所に関連付けられた複数のオファーを取得してキャッシュします。 プリフェッチされたすべての場所は、ユーザー・セッションで後で使用するためにデバイス上にキャッシュされます。 ホーム画面で複数の場所をプリフェッチすることで、訪問者がアプリ内を移動したときに後で使用するオファーを取得できます。 プリフェッチ・メソッドの詳細は、prefetch ドキュメントを参照してください。
バッチ・プリフェッチ・リクエストの追加
app/main/java/com.wetravel/Controller の下にある HomeActivity コントローラー(ホーム画面のソースコード)を更新しましょう。 赤で表示されている 2 つのコードブロックを追加します。
まず、HomeActivity コントローラー(ホーム画面のソースコード)を使用します。このコントローラーは、app/main/java/com.wetravel/Controller にあります。
赤で表示されている 2 つのコードブロックを追加します。
HomeActivity のコードの末尾まで下にスクロールし、setHeader()
関数および現在の 関数の 置き換え onResume()
の後に以下のコードを追加します。
@Override
protected void onResume() {
super.onResume();
targetPrefetchContent();
}
public void targetPrefetchContent() {
List<TargetPrefetchObject> prefetchList = new ArrayList<>();
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_home, null));
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_search, null));
Target.TargetCallback<Boolean> prefetchStatusCallback = new Target.TargetCallback<Boolean>() {
@Override
public void call(final Boolean status) {
HomeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
String cachingStatus = status ? "YES" : "NO";
System.out.println("Received Response from prefetch : " + cachingStatus);
setUp();
}
});
}};
Target.prefetchContent(prefetchList, null, prefetchStatusCallback);
}
おそらく、ファイルに Target クラスが読み込まれていないという警告が表示されます。 次の図に示すように、HomeActivity コントローラの最上部に Target クラスをインポートしてください。
import com.adobe.mobile.Target;
import com.adobe.mobile.TargetPrefetchObject;
「シンボル変数 wetravel_engage_home が見つかりません」と「シンボル変数 wetravel_engage_search が見つかりません」というエラーも表示されます。 これらを Constant.java
ファイルに追加します(アプリ/src/メイン/java/com/wetravel/Utils 内)。
public static final String wetravel_engage_home = "wetravel_engage_home";
public static final String wetravel_engage_search = "wetravel_engage_search";
バッチ・プリフェッチ・リクエスト・コードの説明
targetPrefetchContent()
prefetchContent()
Constant.wetravel_engage_home
Constant.wetravel_engage_search
非同期と同期の比較
先ほど実装したコードを使用して、ホーム画面がレンダリングされる直前に、プリフェッチリクエストは同期されたブロック呼び出しとして行われます。 新しいコードを HomeActivity コントローラーに貼り付けた際、setUp()
関数の実行を onResume()
関数から Target リクエストの後まで移動しました。 これは、アプリを初めて開いたときにコンテンツをパーソナライズするシナリオで役立ちます。この場合、最初の画面がレンダリングされる前に、Target サーバーからパーソナライズされたコンテンツが返された(またはタイムアウトした)ことを確認できるからです。 リクエストを(バックグラウンドで)非同期に読み込めるようにするには、代わりに setUp()
関数内で onCreate()
を呼び出します。
バッチ・プリフェッチ・リクエストの検証
アプリを再構築し、Android エミュレーターを開きます。 (以下のスクリーンショットでは、Android Q version 9+、API レベル 29 の Pixel 2 を使用しています)。 プリフェッチ応答は、「prefetch response received」と読みます。
ホーム画面がレンダリングされると、プリフェッチリクエストが読み込まれます。 Logcat で、“Target” をフィルタリングして、リクエストと応答を確認します。
正常な応答が表示されない場合は、ADBMobileConfig.json
ファイルの設定と HomeActivity ファイルのコード構文を確認してください。
2 つの場所がデバイスにキャッシュされるようになりました。 場所の名前は間もなく Target インターフェイスに遅延読み込みされ、アクティビティで使用する際に、様々なドロップダウンメニューで選択できるようになります。
キャッシュされた各場所への読み込み要求の追加
ロケーションがプリフェッチされ、その応答がデバイスにキャッシュされたら、キャッシュからオファーコンテンツを取得する Target.loadRequest()
メソッドを追加して、アプリケーションの更新に使用できます。 プリフェッチリクエストで実行される engageMessage()
という新しいカスタムメソッドを追加します。 engageMessage()
が Target.loadRequest()
を呼び出します。 engageMessage()
は setUp()
の前に実行され、画面が設定される前に読み込みリクエストが呼び出されるようにします。
まず、HomeActivity で wetravel_engage_home ロケーションの engageMessage()
呼び出しとメソッドを追加します。
更新されたコードを次に示します。
public void targetPrefetchContent() {
List<TargetPrefetchObject> prefetchList = new ArrayList<>();
Map<String, Object> params1;
params1 = new HashMap<String, Object>();
params1.put("at_property", "your at_property value goes here");
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_home, params1));
prefetchList.add(Target.createTargetPrefetchObject(Constant.wetravel_engage_search, params1));
Target.TargetCallback<Boolean> prefetchStatusCallback = new Target.TargetCallback<Boolean>() {
@Override
public void call(final Boolean status) {
HomeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
String cachingStatus = status ? "YES" : "NO";
System.out.println("Received Response from prefetch : " + cachingStatus);
engageMessage();
setUp();
}
});
}};
Target.prefetchContent(prefetchList, null, prefetchStatusCallback);
}
public void engageMessage() {
Target.loadRequest(Constant.wetravel_engage_home, "", null, null, null,
new Target.TargetCallback<String>(){
@Override
public void call(final String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("Engage Message : " + s);
if(s != null && !s.isEmpty()) Utility.showToast(getApplicationContext(), s);
}
});
}
});
}
次に、SearchBusActivity の wetravel_engage_search の場所に対する engageMessage()
呼び出しおよびメソッドを追加します。 engageMessage()
の呼び出しは、onResume()
の呼び出しの前に setUpSearch()
メソッドで設定されるため、画面が設定される前に実行されます。
更新されたコードを次に示します。
@Override
public void onResume() {
super.onResume();
engageMessage();
setUpSearch();
}
public void engageMessage() {
Target.loadRequest(Constant.wetravel_engage_search, "", null, null, null,
new Target.TargetCallback<String>(){
@Override
public void call(final String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("Engage Message : " + s);
if(s != null && !s.isEmpty()) Utility.showToast(getApplicationContext(), s);
}
});
}
});
}
SearchBusActivity に Target メソッドを追加したので、必ず Target のクラスをインポートしてください。
import com.adobe.mobile.Target;
import com.adobe.mobile.TargetPrefetchObject;
リアルタイムリクエストの追加
アプリに追加する次のリクエストは、ありがとう画面のリアルタイムリクエストになります。 「リアルタイム」とは、リクエストが行われ、応答が直ちに適用される(後でキャッシュされない)ことを意味します。 後のレッスンでは、このリクエストを使用して、ユーザーの旅行先に合わせてパーソナライズされたエクスペリエンスを作成します。
次に、「ありがとうございます」画面でリアルタイムリクエストを追加します。 ThankYouActivity ファイルで、赤で表示されている変更を行います。
ThankYouActivity ファイルの末尾までスクロールします。 getRecommandations()
関数の 3 行をコメントアウトし、targetLoadRequest()
関数の呼び出しを追加します。
// AppDialogs.dialogLoaderHide();
// recommandations.addAll(recommandation.recommandations);
// recommandationbAdapter.notifyDataSetChanged();
次のコード行を getRecommandations()
関数に追加します。
targetLoadRequest(recommandation.recommandations);
次に、targetLoadRequest()
の関数を定義する必要があります。
filterRecommendationBasedOnOffer()
関数の後にこのコードブロックを追加します。
public void targetLoadRequest(final ArrayList<Recommandation> recommandations) {
Target.loadRequest(Constant.wetravel_context_dest, "", null, null, null, new Target.TargetCallback<String>() {
@Override
public void call(final String response) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
AppDialogs.dialogLoaderHide();
filterRecommendationBasedOnOffer(recommandations, response);
recommandationbAdapter.notifyDataSetChanged();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
ThankYouActivity に Target メソッドを追加したので、必ず Target クラスを読み込んでください。
import com.adobe.mobile.Target;
import com.adobe.mobile.TargetPrefetchObject;
targetLoadRequest () コードの説明
targetLoadRequest()
Target.loadRequest()
に実行される(SDKの一部ではない)ユーザー定義関数Target.loadRequest()
filterRecommendationBasedOnOffer()
recommandations.addAll()
filterRecommendationBasedOnOffer()
が Target 応答を受信して解析した後で実行されるようになりましたアプリ内のユーザー定義関数これは、アプリに加えた、ホーム画面に追加されたリクエストに対する、より高度なアップデートでした。ここで内容を確認してみましょう。
- 以前、デフォルトの 3 つのプロモーションを表示していたアプリの動作を、コードの行をコメントアウトすることで中断しました
- 代わりに、新しい関数を実行するようにアプリに指示し、targetLoadRequest を任意に命名しました
- Target.loadRequest メソッドを使用して Target にリクエストを行い、
targetLoadRequest
のオファー応答を受信したら直ちにfilterRecommendationBasedOnOffer()
関数を実行するように、Target 関数を定義しました filterRecommendationBasedOnOffer()
関数は応答を解釈し、画面に適用するプロモーションを決定します。
これは、モバイルアプリで Target を使用する場合の非常に一般的な使用パターンです。 モバイルアプリのほぼすべての側面をパーソナライズできるという点で、どちらも非常に強力です。 また、アプリコードと、後で Target インターフェイスで定義するオファーとの調整も必要です。 この調整により、一部のパーソナライゼーションのユースケースでは、アクティビティを開始するために、アプリストアでアプリを更新する必要が生じる場合があります。
リアルタイムリクエストの検証
Android エミュレーターを開き、次のすべての手順を実行して旅行を予約します。ホーム / バス検索結果/シートの選択、支払いオプション (空白のデータのあるすべての支払いオプションが機能します)。
最後の「ありがとうございます」画面で、Logcat の応答を確認します。 応答は、「Default content was returned for "wetravel_context_dest":
プリフェッチされた場所のキャッシュからの消去
セッション中に、プリフェッチされた場所をクリアする必要が生じる場合があります。 例えば、予約が発生した場合、ユーザーが「関与」し、予約プロセスを理解しているので、キャッシュされた場所をクリアすることは理にかなっています。 セッション中に別の旅行を予約する場合、予約のガイドとしてホーム画面と検索結果画面の元の場所は必要ありません。 キャッシュから場所をクリアし、おそらく割引された 2 回目の予約やその他の関連するシナリオのために、新しいオファーをプリフェッチする方が理にかなっています。 セッション中に予約が行われた場合に、新しい場所をプリフェッチするロジックをホーム画面と検索結果画面に追加できます。
この例では、予約が行われる際に、セッションのプリフェッチされた場所をクリアするだけです。 それには、Target.clearPrefetchCache()
関数を呼び出します。 次に示すように、targetLoadRequest()
関数内に関数を設定します。
Target.clearPrefetchCache()
おめでとうございます。 アプリにパーソナライゼーションのフレームワークが追加されました。 次のレッスンでは、これらの場所にパラメーターを追加して、パーソナライゼーション機能を強化します。