概要:Trusted Web Activities(TWA)でAppsFlyerを使用し、インストールの計測とアプリ内イベントの記録を行います。
はじめに
Trusted Web Activitiesとは
Trusted Web Activities(TWA)は、Androidアプリ内にWebコンテンツを表示する新しい仕組みです。 TWAでは、アプリ内イベントをどのように記録するかが課題になります。この記事では、その対応方法を説明します。 TWAについて詳しくは、こちらを参照してください。
TWAは、プログレッシブWebアプリでも使用できます。
プログレッシブWebアプリとは
プログレッシブWebアプリ(PWA)は、アプリのようなユーザー体験を提供する、すべてWeb技術で構成されたアプリです。 PWAの形態の1つに、TWAをベースとするアクティビティで構成されたAndroidアプリがあります。この記事では、この形態のPWAを扱います。 TWAを使用すると、PWAを独立したAndroidアプリに組み込み、既存のPWAをPlay Storeで公開できます。
Web上のみで動作するもう一方の形態のPWAは、この記事の対象外です。 PWAについて詳しくは、こちらを参照してください。
このタブでは、アプリ内の全画面WebブラウザであるTrusted Web Activityに組み込まれたPWAを説明します。このようなアプリには、Androidのアプリ全体を管理するApplicationクラスがありますが、画面はすべてWebベースです。
この形態のPWAでは、インストールを計測できます。 Web上のみで動作するもう一方の形態のPWAでは、インストールを計測できません。
TWA
TWAからのアプリ内イベントの送信
通常、アプリ内イベントは、ネイティブの画面からAppsFlyer SDKを使用して送信されます。 TWAはWebベースの画面であり、ネイティブの画面ではないため、AppsFlyer SDKを使用してアプリ内イベントを送信することはできません。代わりに、サーバー間通信によるアプリ内イベントを使用できます。 TWAでサーバー間通信によるイベントを送信するには、以下の手順に従ってください。
事前準備
TWAからAppsFlyerにイベントを送信する前に、次の作業を行ってください。
- プロジェクトレベルのGradleファイルに、次のリポジトリを追加します。
maven { url "https://jitpack.io"} - 次のライブラリを追加します。
- android.supportライブラリの場合:
- build.gradleに次の記述を追加します。
implementation 'com.github.GoogleChrome.custom-tabs-client:customtabs:91b4a1270b' - 次のライブラリをインポートします。
import android.support.customtabs.CustomTabsClient; import android.support.customtabs.CustomTabsIntent; import android.support.customtabs.CustomTabsServiceConnection; import android.support.customtabs.CustomTabsSession; import android.support.customtabs.trusted.TrustedWebActivityIntentBuilder; import static android.support.customtabs.TrustedWebUtils.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY
- build.gradleに次の記述を追加します。
- androidXライブラリの場合:
- build.gradleに次の記述を追加します。
implementation 'com.github.GoogleChrome:android-browser-helper:ff8dfc4ed3' - 次のライブラリをインポートします。
import androidx.browser.customtabs.CustomTabsClient; import androidx.browser.customtabs.CustomTabsIntent; import androidx.browser.customtabs.CustomTabsServiceConnection; import androidx.browser.customtabs.CustomTabsSession; import androidx.browser.trusted.TrustedWebActivityIntentBuilder;
- build.gradleに次の記述を追加します。
- android.supportライブラリの場合:
AppsFlyer IDの取得
サーバー間通信によるイベントを送信するには、AppsFlyer IDが必要です。 AppsFlyer IDは、AppsFlyer Android SDKから取得できます。
まず、AppsFlyer Android SDKを実装してください。その後、次のSDK APIでAppsFlyer IDを取得できます。
String appsflyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
TWAへのAppsFlyer IDの送信
AppsFlyer IDは、次の2つの方法のいずれかで送信できます。
URLへのAppsFlyer IDと顧客ユーザーIDの追加
TWAを起動するインテントを作成する際に、そのURLにパラメータを渡すことができます。
private void launchTwa(String cuid, String af_id) {
CustomTabsServiceConnection customTabsServiceonnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
Log.d(LOG_TAG, "onCustomTabsServiceConnected");
// Setting up CustomTabsSession that is used to build an intent
mClient = client;
CustomTabsSession session = mClient.newSession(null);
// Creating the intent to launch TWA using URL with query params that can be read by the Web App
TrustedWebActivityIntentBuilder twaIntentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(defaultUri + "?cuid=" + cuid + "&appsflyer_id=" + af_id));
Intent twaIntent = twaIntentBuilder.build(session);
startActivity(twaIntent);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOG_TAG, "onCustomTabsServiceDisconnected");
}
};
CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", customTabsServiceonnection);
}
AppsFlyer IDの取得
Webベースの画面が起動したら、次の簡単なJavaScriptコードでAppsFlyer IDを取得できます。
let url = new URL(document.location.href);
let appsflyerID;
url.searchParams.forEach((value, key) => {
if(key === 'appsflyer_id') {
appsflyerID = value;
}
})
取得したAppsFlyer IDは、後で使用できるようローカルストレージに保存します。
カスタムヘッダーによるAppsFlyer IDの送信
TWAには、カスタムヘッダーを渡すことができます。サーバーはこれらのヘッダーを取得し、Cookieに設定してブラウザに送信します。その後、次のJavaScriptコードでAppsFlyer IDを取得できます。
private void launchTwa(String cuid, String af_id) {
CustomTabsServiceConnection customTabsServiceonnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
Log.d(LOG_TAG, "onCustomTabsServiceConnected");
// Setting up CustomTabsSession that is used to build an intent
mClient = client;
CustomTabsSession session = mClient.newSession(null);
// Creating the intent to launch TWA using URL with query params that can be read by the Web App
TrustedWebActivityIntentBuilder twaIntentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(defaultUri);
Intent twaIntent = twaIntentBuilder.build(session);
// Passing additional custom headers to the intent so they can be read by the Web App
Bundle customHeaders = new Bundle();
customHeaders.putString("twa_params", "cuid=" + cuid + "&=appsflyer_id" + af_id");
twaIntent.putExtra(Browser.EXTRA_HEADERS, customHeaders);
startActivity(twaIntent);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOG_TAG, "onCustomTabsServiceDisconnected");
}
};
CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", customTabsServiceonnection);
}
AppsFlyer IDの取得
JavaScriptには、ヘッダーにアクセスするためのAPIがありません。そのため、サーバーはコンバージョンデータをCookieとしてWebベースの画面に返す必要があります。サーバーは、AppsFlyer IDを含むカスタムヘッダーを取得し、データを解析してCookieとしてWebページに送信します。
ページの読み込み時に、AppsFlyer IDのCookieを取得するJavaScriptコードが実行されるようにしてください。
// get the conversion data cookie
// function taken from https://plainjs.com/javascript/utilities/set-cookie-get-cookie-and-delete-cookie-5/
function getCookie(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}
// get the cookie
var conversionData = JSON.parse(getCookie('appsflyer_id'));
console.log(appsflyer_id);
アプリ内イベントの送信
アプリ内イベントを送信するには、イベントデータを自社のサーバーに送信し、そのサーバーからAppsFlyerにイベントを送信します。アプリ内イベントを送信するには、以下の情報も必要です。
- SDKのdev key — 重要! SDKのdev keyは機密情報であり、TWA内に含めてはいけません。 TWAを使用してサーバー間通信によるアプリ内イベントを送信する場合は、SDKのdev keyを必ずサーバー側で安全に保管してください。
- アプリID:AndroidのManifest.xmlに記載されているアプリIDです。
AppsFlyer ID、SDKのdev key、アプリIDの3つのパラメータが揃うと、アプリ内イベントを送信できます。 Webベースの画面でイベントが発生するたびに、Webサーバーにリクエストを送信してイベントを処理します。 Webサーバーは、イベントに関連するデータを取得してイベントデータを構成し、AppsFlyerに送信します。
サーバー間通信によるアプリ内イベントの送信例は、こちらを参照してください。
コンバージョンデータによるWebコンテンツのカスタマイズ
AppsFlyer SDKは、次の2つのAPIを通じてコンバージョンデータを提供します。
- Get conversion data:インストール後の初回起動時と、その後のアプリ起動時に呼び出されます。
- On app open attribution:OneLinkによるディープリンクでアプリが開かれた際に呼び出されます。
コンバージョンデータを使用して、Webコンテンツをカスタマイズできます。
TWAへのコンバージョンデータの送信
上記のいずれかの方法で取得したコンバージョンデータは、Webサーバーに送信できます。送信には、次のようにカスタムヘッダーを使用します。
private void launchTwa(Map<0> conversionData, String cuid, String af_id) {
CustomTabsServiceConnection customTabsServiceonnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
Log.d(LOG_TAG, "onCustomTabsServiceConnected");
// Setting up CustomTabsSession that is used to build an intent
mClient = client;
CustomTabsSession session = mClient.newSession(null);
// Creating the intent to launch TWA using URL with query params that can be read by the Web App
TrustedWebActivityIntentBuilder twaIntentBuilder = new TrustedWebActivityIntentBuilder(Uri.parse(defaultUri);
Intent twaIntent = twaIntentBuilder.build(session);
// Passing additional custom headers to the intent so they can be read by the Web App
Bundle customHeaders = new Bundle();
customHeaders.putString("twa_params", "cuid=" + cuid + "&=" + af_id");
customHeaders.putString("conversion_data", conversionData);
twaIntent.putExtra(Browser.EXTRA_HEADERS, customHeaders);
startActivity(twaIntent);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOG_TAG, "onCustomTabsServiceDisconnected");
}
};
CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", customTabsServiceonnection);
}
クライアント側でのコンバージョンデータの取得
JavaScriptには、ヘッダーにアクセスするためのAPIがありません。そのため、サーバーはコンバージョンデータをCookieとしてWebベースの画面に返す必要があります。サーバーは、コンバージョンデータを含むカスタムヘッダーを取得し、データを解析してCookieとしてWebページに送信します。
ページの読み込み時に、コンバージョンデータのCookieを取得し、その内容に応じてコンテンツをカスタマイズするJavaScriptコードが実行されるようにしてください。例えば、航空券の特別価格を訴求するキャンペーンからユーザーがアプリをインストールした場合、そのキャンペーンで紹介した特別価格に関連するコンテンツをWebベースの画面に表示できます。
// get the conversion data cookie
// function taken from https://plainjs.com/javascript/utilities/set-cookie-get-cookie-and-delete-cookie-5/
function getCookie(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}
// get the cookie
var conversionData = JSON.parse(getCookie('conversion_data'));
console.log(conversionData);
/*
conversion data example:
{
campaign: "CAMPAIGN_NAME", // "None" if not specified on the link
media_source: "MEDIA_SOURCE", //"None" if not specified on the link
cost_cents_USD : "0",
is_first_launch: true,
install_time: "2018-12-30 23:59:39.330",
orig_cost: "0.0",
af_click_lookback: "7d",
click_time: "2018-12-30 23:59:09",
cost_cents_USD: "0",
af_status: "Non-organic"
}
*/
コンバージョンデータの活用例については、こちらを参照してください。
PWA
PWAのインストール計測
他のAndroidアプリと同様に、アプリにAppsFlyer SDKを実装して、インストールを計測し、コンバージョンデータを取得できます。
インストールを計測するには、こちらの手順に従ってSDKを実装するだけです。
コンバージョンデータを使用したコンテンツのカスタマイズ
ユーザーのアプリインストールにつながったキャンペーンに応じて、Webコンテンツをカスタマイズできます。例えば、Webストアの商品を20%割引で購入できるキャンペーンから、ユーザーがアプリをインストールしたとします。コンバージョンデータを取得し、アプリでWebベースの画面が開かれた時点で割引を適用できます。
コンバージョンデータによるWebコンテンツのカスタマイズについては、こちらの手順に従ってください。
PWAでのイベントの記録
PWAは、実質的にWebベースの画面であるTWAを使用します。 TWAはWebベースの画面であり、ネイティブの画面ではないため、AppsFlyer SDKを使用してアプリ内イベントを送信することはできません。代わりに、サーバー間通信によるアプリ内イベントを使用できます。
PWAのアプリ内イベントを送信する方法は、こちらの手順を参照してください。