概要: AndroidアプリにAppsFlyerのSDKを追加することで、アプリのインストール、アプリ内イベント、そのインストールをもたらしたメディアソースなどを計測することが可能になります。
1. 概要
- SDKバージョン: 6.2.3 (リリースノート)
- 非推奨のSDKバージョン
AppsFlyerのSDKを利用すると、アプリのインストールやアプリ内イベントを計測することができます。
このSDKは、Java/Kotlinで使用可能です。
以下を記録するために、SDKをアプリに実装してください:
- アプリインストール数
- ユーザーエンゲージメント(アプリ起動やアプリ内イベントなど)
1.1 SDK実装 - 必須項目
タブ | 目的 | 完了後 |
---|---|---|
SDK 実装 (必須) |
SDKの追加および設定方法 |
|
主要API (推奨) |
アプリ内イベントと収益を計測や、ディープリンクを実行してアプリ内でコンバージョンデータを取得など |
|
追加のAPIs |
オプションAPIの実装と使用方法: 例:アンインストール計測やユーザー招待の計測など |
|
SDKが提供しているAPIの一覧 |
1.2 AndroidプラットフォームとのSDK互換性
- Android V4.0以降
- Amazon Fire TV(スマートTV)などの非モバイルAndroidプラットフォーム
- Android向け第三者プラットフォーム (例: Amazon、Baidu)
2. アプリへのSDKの追加
このセクションでは、AppsFlyerのSDKのAndroidプロジェクトへの追加方法について説明しています。
重要!
Android SDK V6
には、旧バージョンからSDKの機能やAPIに大きな変更があり、サポート終了したものやメソッド名の変更も含まれていますのでご注意ください。詳細については、SDK V5.x.からの移管に関するガイドを参照してください。
2.1 プロジェクトへのSDKの追加
アプリに SDK を追加するには、次のいずれかの方法を使用してください。
- [推奨] Gradleを使用する
- マニュアルでSDKを追加する
dependencies
の前にモジュールレベル/app/build.gradleに次のコードを追加します。repositories { mavenCentral() }
- dependecyとして最新のAppsFlyer SDKを追加します。最新のバージョンはこちらをご確認ください。
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:6.0.0' }
- 次のスクリーンショットを参考にdependenciesを取得してプロジェクトを同期してください。
2.2 Android install referrerのアプリへの追加
Android Install Referrerはアトリビューションの精度を改善し、不正から守ります。APIはAppsFlyerのAndroid SDKバージョン4.8.6以降よりサポートされています。
注
Google は2020年3月に BroadcastReceiverを廃止しました。
- この変更はアプリには影響しません。
- 第三者プラットフォーム(Google Play以外のアプリストア)での計測のために、まだBroadcastReceiverが必要になる場合があります。アプリが掲載されているストアで確認してください。
- インストールリファラに実装が必須になりました。
アプリにInstall referrerを追加するには、2つの方法があります。
- Gradleを使用する(推奨)
- Install referrerを手動で追加する
dependencyとしてAndroid Install Referrerを追加してください。最新バージョンはこちらを参照してください。
-
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:5.+' implementation 'com.android.installreferrer:installreferrer:1.1' }
- 次のスクリーンショットを参考にdependenciesを取得してプロジェクトを同期してください。
ProGuardを使用中で、Googleの新しいリファラAPIを使用する場合には、以下のProGuardルールを設定する必要があります: -keep public class com.android.installreferrer.** { *; }
- Install Referrer aarのダウンロード
- プロジェクトにそれを追加します。
- マニフェストに次のパーミッションを追加します。
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
2.3 必須パーミッションの設定
パーミッションの追加は確率論的モデリングの精度向上に貢献し、SDKがWifiやキャリアネットワークなどのデータを送信できるようにします。このデータはローデータレポートにも反映され、キャンペーンの分析や最適化に使用できます。
必須パーミッションの追加
- 次の権限を
AndroidManifest.xml
に追加てください:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
2.4 BroadcastReceiverの設定によるGoogle Playからのデータ取得
注
Google は2020年3月に BroadcastReceiverを廃止しました。
- この変更はアプリには影響しません。
- 第三者プラットフォーム(Google Play以外のアプリストア)での計測のために、まだBroadcastReceiverが必要になる場合があります。アプリが掲載されているストアで確認してください。
- インストールリファラに実装が必須になりました。
BroadcastReceiverはAppsFlyerが計測に使用するGoogle Playよりデータを受診します。BroadcastReceiverを使用するとアトリビューションの精度が高くなります。
インストールリファラーブロードキャストレシーバの実装には、次の2つのオプションがあります。
AndroidManifest.xml
内のINSTALL_REFERRER
を受け取るレシーバーがない場合、以下のレシーバーをapplication
タグ内に追加してください。
<application>
<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
<application>
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
ヒント
レシーバーをAndroidManifest.xmlに追加した後に"Unresolved class SingleInstallBroadcastReceiver"(未解決のクラス:SingleInstallBroadcastReceiver)というエラーが発生した場合は、アプリを最初にビルドしているかを確認してください。
3. SDKの実装と初期化
このセクションでは、SDKの実装と初期化の方法について説明しています。
3.1 Dev Keyの取得
AppsFlyerではdev keyを使用して個々のアカウントを識別します。SDKがAppsFlyerアカウントに関するデータを安全に送受信できるようにするためにdev keyは必須です。
注意:間違ったdev keyを使用すると、SDKから送信されるデータに影響を与え、アトリビューションやレポーティングが正しく行えません。
Dev Keyの取得
- アプリの管理画面にログインしてください。
- 管理画面左メニューの 設定 下にあるアプリ設定 をクリックしてください。
- dev keyをコピーしてください。
3.2 SDKの初期化
グローバルアプリケーションクラスの登録
AndroidManifest.xml
ファイルのapplication
タグ内に、次の行を追加してください。
android:name="<APP.PACKAGE.NAME>.<AFApplication>"
-
<APP.PACKAGE.NAME>
- 実際のアプリのパッケージネームに書き換えてください。 -
<AFApplication>
- グローバルアプリケーションクラスに設定した名前に書き換えてください。
manifest.xml内のこの行は、何がグローバルアプリケーションであるかをアプリケーションに伝えます。前述のように、こうすることでAppsFlyer SDKがアプリ全体にアクセス可能になります。
SDKの初期化
アプリのグローバルアプリケーションクラス内でSDKを初期化することをお勧めします。これにより、ディープリンクを含むすべてのシナリオでSDKを初期化できます。
アプリのグローバルアプリケーションクラス内でのステップは次となります。
- アプリのグローバルアプリケーションクラス内にて次のライブラリをインポートしてください。
import android.app.Application; import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; import java.util.Map;
- グローバルクラス内でdev keyを変数に設定します。AF_DEV_KEYが好ましいです。
重要:SDKを初期化する際に必ず正しいdev keyを使用してください。一致しないdev keyを使用するとSDKから送信されるデータに影響を与え、アトリビューションやレポーティングに問題が発生します。public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; //... }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; //... }
- グローバルクラス内で、
super.onCreate()
をコールした後、AppsFlyerConversionListener
を実装してください。ステップ4のコードを参照してください。 - グローバルクラス内で、
ConversionListener
の後に、init()
のメソッドを使用してSDKを初期化してください。
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; @Override public void onCreate() { super.onCreate(); AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } @Override public void onConversionDataFail(String errorMessage) { Log.d("LOG_TAG", "error getting conversion data: " + errorMessage); } @Override public void onAppOpenAttribution(Map<String, String> attributionData) { for (String attrName : attributionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + attributionData.get(attrName)); } } @Override public void onAttributionFailure(String errorMessage) { Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage); } }; AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, this); } }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; override fun onCreate() { super.onCreate() val conversionDataListener = object : AppsFlyerConversionListener{ override fun onConversionDataSuccess(data: MutableMap<String, Any>?) { data?.let { cvData -> cvData.map { Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}") } } } override fun onConversionDataFail(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } override fun onAppOpenAttribution(data: MutableMap<String, String>?) { data?.map { Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}") } } override fun onAttributionFailure(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } } AppsFlyerLib.getInstance().init(devKey, conversionDataListener, this) } }
- アプリのグローバルクラス内で
start()
をコールしてください。
AppsFlyerLib.getInstance().start(this);
AppsFlyerLib.getInstance().start(this)
3.3 SDK初期化の遅延
SDKの初期化を遅らせるには、Activityクラスから start をコールすることが可能です。
このオプションは、例えば、GDPR や CCPA の要件などにより、ユーザーの同意が得られるまで start を遅延する必要がある場合に使用できます。
Activity クラスで start を呼び出すとき:
- Activityのインスタンスをアプリケーションではなく引数としてパスしてください。
- ディープリンクの機能を使用する場合には、start を持っておらず、かつディープリンクできるすべてのアクティビティに
start()
のAPI を追加してください。
4. インストール計測のテスト
ここまでで、オーガニックインストールと非オーガニックインストールをシミュレートすることによるSDK実装テストの準備ができました。このセクションの内容を完了すると、アプリの管理画面上にオーガニックと非オーガニックの2つのインストールが表示されるようになります。
テストのシナリオと手順の詳細については、SDK実装テストを参照してください。
4.1 テスト端末の登録
インストールのテストを開始する前に、使用するテスト端末をホワイトリスト登録 してください。
4.2 オーガニックインストールのテスト
オーガニックインストールは通常、アプリストアからの直接インストールであり何も紐付けがされないインストールです。
オーガニックインストールをシミュレートするには:
- コンピュータにテスト端末が接続されていることを確認してください。
- Android StudioでLogcatを開いてください。
- Android Studioから、テスト端末またはシミュレーターにアプリをインストールしてください。
- アプリが起動するのを待ってください。
- Logcatで、アプリのパッケージ名を探してください。
次が表示されるはずです。
スクリーンショットのハイライト箇所はSDKがオーガニックインストールをレポートしていることを表します。本データはAFApplicationクラス内onConversionDataSuccess
メソッドから取得されます。コンバージョンデータの取得については本ガイド後半で説明します。
注: SDK ver5以降、 onConversionDataSuccess
がコンバージョンデータを取得するメソッドの名称です。5.0.0より前のSDKバージョンを使用している場合、メソッドの名前は onInstallConversionDataLoaded
です。SDK ver5.0.0にアップグレードすることをお勧めします。詳細についてはこちらをクリックしてください。
オーガニックインストールが、 管理画面オーバービュー ページに表示されるはずです 。
管理画面にインストールが表示されない場合は、 SDKトラブルシューティングガイドを参照してください。
4.3 非オーガニックインストールのテスト
非オーガニックインストールは、通常は広告エンゲージメントに紐付けられたインストールです。計測URLを使用して、非オーガニックインストールをシミュレートできます。
非オーガニックインストールをシミュレートするには:
- マニフェストで、アプリのパッケージ名を確認します。 com.company.app
- 次のURLにて、<app_id>を、あなたのアプリのパッケージ名に書き換えてください。
例:https://app.appsflyer.com/<app_id>?pid=Test&c=Test
https://app.appsflyer.com/id0123456789?pid=Test&c=Test
- c パラメータには、キャンペーンの名前を指定します。
- pid パラメータには、インストールが紐づくメディアソースの名前を指定します。
- コンピュータからクリックをテストする場合には、Advertising ID(GAID)を追加する必要があります(手順1で、計測リンクの末尾に
&advertising_id=<GAID>
を追加してください)。
- 次のURLにて、<app_id>を、あなたのアプリのパッケージ名に書き換えてください。
- デバイスに計測リンクを送信します。たとえば、メールやWhatsAppに送信できます。
- 端末上で、URLをクリックしてください。
- アプリがアプリストアに掲載されている場合、アプリストアにリダイレクトされます。アプリストアからはアプリをダウンロードしないでください。ステップ5に進んでください。
- アプリがアプリストアに掲載されておらず、まだ開発中の場合、画面にはアプリがアプリストアでは見つからないというメッセージが表示されます。そのままステップ5に進んでください。
- Android StudioでLogcatを開いてください。
- USBケーブルを使用して端末をコンピューターに接続してください。
- Android Studioから、テスト端末にアプリをインストールしてください。
- Logcatで、アプリのパッケージ名を探してください。
次が表示されるはずです。
非オーガニックインストールが、管理画面の オーバービュー ページに表示されるはずです 。
注
SDK 実装のテストとデバッグが完了したら、SDK logsをオフにしてください。
SDK実装時によくある問題
SDKを実装するときに起こりうる問題と、それらの対処法の詳細については、以下を参照してください。
ProGuardに関する注意
ProGuardを使用していて、 AFKeystoreWrapper
クラスに関する警告が発生した場合は、ProGuardルールファイルに次のコードを追加してください。
-keep class com.appsflyer.**{ *; }
バックアップに関して
AndroidManifest.xmlの<application>タグ内に android:fullBackupContent = " true "
を追加すると、エラーが発生する可能性があります。
Manifest merger failed : Attribute application@fullBackupContent value=(true)
このエラーを修正するには、AndroidManifest.xmlファイルの<application>タグに tools:replace="android:fullBackupContent"
を追加してください。
独自のバックアップルールを指定している場合(android:fullBackupContent="@xml/my_rules"
)には、上記の手順に加えて、以下のルールを追加してAppsFlyerのルールと手動でマージしてください。
<full-backup-content>
...//your custom rules
<exclude domain="sharedpref" path="appsflyer-data"/>
</full-backup-content>
resourceファイルの欠如
Android SDK V5以降を使用している場合は、APKファイル内で、 classes.dex および resources ファイルに加えて、 com > appsflyer > internal のフォルダ内に a- と b- のファイルがあることを確認してください。
注意: SDK 5.3.0より前のバージョンでは、ファイル名はa. とb.になります。
以下スクリーンショットも活用しながら、Android Studio内でAPKを開いて、必要なファイルがあることを確認してください。
これらのファイルが見つからない場合、SDKはサーバーにネットワークリクエストを送信できません。その場合には、CSM、もしくはサポートまでご連絡ください。
5. アプリ内イベントの計測
注意:これらのガイドはアプリ開発者向けですが、マーケティング担当者はユーザーの質を計測するためにどのアプリ内イベントを計測する必要があるかを決定し、その情報をアプリ開発者へインプットすることが必要不可欠です。
アプリ内イベントと収益を記録することで、ユーザーの質を測定することが可能です。
アプリ内イベントにより、アプリ内でのユーザーの動きに関するインサイトを得ることができます。ROI(投資収益率)やLTV(顧客生涯価値)を計測するために、時間を取って計測するイベントを定義することをお勧めします。
アプリ内イベントを計測する方法はいくつかあります。最も一般的な方法は、SDKを介してのイベント送信です。これについては本ページで説明しています。アプリ内イベントを記録する他の方法については、 アプリ内イベント概要ガイドを確認してください。
アプリの特定のカテゴリーに合わせて、たとえば、旅行、ゲーム、eコマースなど、業界毎の推奨するアプリ内イベントを使用できます。
5.1 アプリ内イベントの名前とパラメータ
SDKには、アプリ内イベントに関連する2つのインターフェイスがあります。
- AFInAppEventType - 定数:アプリ内イベントのイベント名
- AFInAppEventParameterName - 定数:アプリ内イベントのイベントパラメータ名
2つのインターフェイスを次の理由から推奨します。
- これらの共通となるアプリ内イベント名ではAppsFlyerからFacebook、Google、TwitterやSnapchatなどに自動的にマッピングします。
- 後方互換性 - もしAppsFlyerがイベント名やパラメータを変更した場合、後方互換性があります。
これらの2つのインターフェイスを使用するにはインポートします。
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventType;
推奨するアプリ内イベント名とパラメータのリスト をご確認ください。
5.2 収益の計測
収益はどのアプリ内イベントでも送信できます。af_revenue
のイベントパラメータを使って(AFInAppEventParameterName.REVENUE
)、収益をアプリ内イベントの一部として計測します。正負を問わず、あらゆる数値を入力できます。
af_revenue
は、AppsFlyerのローデータと管理画面で収益としてカウントされる唯一のイベントパラメータです。詳細については、こちらを参照してください。
収益をアプリ内イベントで送る際に次の点をご注意ください。
- 通貨コード(以下参照)を設定する際は、ISO 4217の3文字を使用してください。(デフォルトはUSDです)。
- 次のメソッドを呼び出すことにより、すべてのイベントの通貨コードを設定できます。:
AppsFlyer.setCurrencyCode( " ZZZ " )
通貨単位の設定、管理画面上での表示、通貨換算については、収益通貨に関するガイドをご覧ください。 - コンマの値区切り、通貨記号、テキストなどは収益の値に含めないでください。たとえば、収益の値は「1234.56」のように設定してください。
例)収益を伴うアプリ内イベント
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt")
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue)
上記の購入イベントには$1,234.56の収益が関連付けられており、管理画面に収益として表示されます。
マイナス収益の計測
稀に、マイナスの収益を計測したいケースがあるかと思います。
例えば、ユーザーが購入した靴の返金を受け取ったとします。
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,-200);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"shoes");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"4875");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , "cancel_purchase" , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE, -200)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE, "category_a")
eventValue.put(AFInAppEventParameterName.CONTENT_ID, "1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY, "USD")
AppsFlyerLib.getInstance().logEvent(applicationContext, "cancel_purchase", eventValue)
注意
上記のコードについて次のことに注意してください。
- 収益値の前にはマイナス記号が追加されています。
- イベント名は「cancel_purchase(購入キャンセル)」で管理画面やローデータレポートでマイナスの収益イベントを確認できます。
5.3 アプリ内購入検証
AppsFlyerのSDKでは、アプリ内購入をサーバーにて検証できる機能を複数提供しています。アプリ内購入を検証したい場合には、 validateAndLogInAppPurchase
を呼び出してください。
アプリ内購入が検証されると、af_purchase
のアプリ内イベントをこのコールで自動的に生成します。
public static void validateAndLogInAppPurchase(Context context,
String publicKey, String signature, String purchaseData,
String price, String currency, HashMap<String, String> additionalParameters);
メソッドパラメータ
- String publicKey – Google Developer Consoleで取得したpublic key
- String signature – transaction signature (購入が完了するとGoogle APIから返されます。)
- String purchaseData – JSON形式の購入された製品 (購入が完了するとGoogle APIから返されます。)
- String price – AppsFlyerへレポートされるアプリ内イベントの収益
- String currency – AppsFlyerへレポートされるアプリ内イベントの通貨。
- HashMap<String, String>追加パラメータ –アプリ内イベントローデータレポートののevent_valueフィールドに表示されるアプリ内イベントの追加パラメータ。
購入検証の成功・失敗コールバック
購入の検証が成功したかどうかを知りたい場合は、applicationクラスにregisterValidatorListenerを実装してください。このリスナーには、「Success」と「Failure」(検証失敗など、あらゆる理由によるもの)の2つのコールバックブロックがあります。
AppsFlyerLib.getInstance().registerValidatorListener(this,new
AppsFlyerInAppPurchaseValidatorListener() {
public void onValidateInApp() {
Log.d(TAG, "Purchase validated successfully");
}
public void onValidateInAppFailure(String error) {
Log.d(TAG, "onValidateInAppFailure called: " + error);
}
});
AppsFlyerLib.getInstance().registerValidatorListener(this, object : AppsFlyerInAppPurchaseValidatorListener {
override fun onValidateInApp() {
Log.d(LOG_TAG, "Purchase validated successfully")
}
override fun onValidateInAppFailure(error: String) {
Log.d(LOG_TAG, "onValidateInAppFailure called: $error")
}
})
アプリ内購入の検証サンプル
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private void handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
Map<String, String> additional_event_values = new HashMap<>();
additional_event_values.put("some_parameter", "some_value");
String price= "10";
String currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(getApplicationContext(), PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private fun handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
val additional_event_values = HashMap<String, String>()
additional_event_values.put("some_parameter", "some_value");
val price= "10";
val currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(this, PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
アプリ内購入を検証するとアプリ内イベントが自動的にAppsFlyerに送信されます。event_valueのパラメータが渡されている、次のサンプルデータをご確認ください。
{
"some_parameter":"some_value", // from additional_event_values
"af_currency":"USD", // from currency
"af_content_id":"test_id", // from purchase
"af_revenue":"10", // from revenue
"af_quantity":"1", // from purchase
"af_validated":true // flag that AF verified the purchase
}
注意
validateAndLogInAppPurchase
の呼び出しにより、af_purchaseのアプリ内イベントが自動的に生成されます。このイベントを別途送信すると、重複してイベントをレポートすることになるので注意してください。
5.4 アプリ内イベントの制限
- イベント名:最大45文字まで(半角)
- イベント値(Event Value):半角1000文字を超えないでください。 - 超えた場合には切り捨てる可能性があります。
- 価格(price)と収益(revenue):5または5.2など、数字と小数点のみを使用してください。
- 価格(price)と収益(revenue)の値は、小数点の後に最大5桁(=小数点第5位)まで設定できます。たとえば以下の様な形です。5.12345
- v4.8.1以降のSDKであれば、英語以外の文字もアプリ内イベントでサポートされています。
5.5 アプリ内イベントの計測例
アプリ内イベントの計測は、イベント名とパラメータを使用してlogEvent
を呼び出すことで実行されます。詳細については、 アプリ内イベントのページを参照してください。
以下は、購入イベントを計測する方法の簡単な例です。業種別の既製のコードスニペットの包括的なリストについては、 業種別のリッチアプリ内イベントのガイドを参照してください
例:アプリ内購入イベント
Map<String,Object> eventValues = new HashMap<>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200);
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY");
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes");
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200)
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY")
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes")
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues)
5.6 オフラインで発生したアプリ内イベントの計測
インターネット接続が利用できないときにユーザーがイベントを開始した場合でも、Appsflyerはそれを記録できます。裏側の仕組み:
- SDKはイベントをAppsFlyerのサーバーに送信し、応答を待ちます。
- SDKが200のサーバーレスポンスを受け取らなかった場合、イベントはキャッシュに保存されます。
- 次の200サーバーレスポンスが受信されると、保存されたイベントはサーバーに再送信されます。
- キャッシュに複数のイベントがある場合は、それらはイベントを次々にサーバーに送信されます。
注
SDKのキャッシュには最大40のイベントを保存できます。つまり、オフライン時に発生した最初の40のイベントのみが保存されます。次の200のサーバーレスポンスまでに発生した、41個目以降のイベント情報はすべては破棄されます。
ローデータに表示されるevent timeは、ユーザーの端末が再びオンラインになった後にイベントがAppsFlyerに送信された時間で、イベントが実際に発生した時間ではありません。
5.7 アプリ内イベント計測時の、成功と失敗の処理
アプリ内イベントの計測時にリスナーを設定できます。このリスナーを使用すると、次の2つのシナリオのロジックを定義できます。
- アプリ内イベントが正常に記録
- アプリ内イベントの記録中にエラーが発生
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Event sent successfully");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Event sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
アプリ内イベントの記録時にエラーが発生した場合には、次の表のようにエラーコードと文字列での説明が提供されます。
エラーコード | 文字列の説明 |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" |
11 |
"Skipping event because 'isStopped' enabled" |
40 |
Network error: Error description comes from Android |
41 |
"No dev key" |
50 |
"Status code failure" + actual response code from the server |
6. OneLinkでのディープリンク
注意:これらのガイドはアプリ開発者向けですが、マーケティング担当者はAppsFlyerの管理画面へアクセスすることができ、OneLinkのディープリンク設定の際にも必要になるので、その情報をインプットすることが必要不可欠です。
ディープリンクを使用すると、より優れたユーザー体験を提供できます。
OneLinkは、AppsFlyerが提供するマルチプラットフォームの計測、 リダイレクト、およびディープリンクのためのソリューションです。
6.1 デバイスの検知とリダイレクト
OneLinkはクリック時に端末種別を検知し、ユーザーを適切なページ(Google Play、iOS AppStore、それ以外のストア、Webページなど)にリダイレクトします。
OneLinkリダイレクトのガイドでは、マルチプラットフォームの計測リンクの実装について説明しています(SDKのコーディングは不要です)。また、ディープリンクの基盤でもあります。
6.2 ディープリンク
ディープリンクを使用すると、ユーザーを特定のアクティビティに誘導し、カスタマイズされたコンテンツを提供できます。これは、リターゲティングキャンペーンを実行するときに特に役立ちます。
OneLinkでのディープリンクを設定するには AppsFlyerの管理画面へのアクセス権限を持つマーケティング担当者と、アプリの編集権限を持つ開発者担当者の協力が必須です。
OneLinkでのディープリンク設定 のガイドを参照してください。
6.3 ディファードディープリンク
ディファードディープリンクを使用すると、新規ユーザーをディープリンクさせ、アプリの初回起動時にカスタマイズされたコンテンツを提供できます。これは、ユーザーの端末に既にアプリがインストールされている必要がある、通常のディープリンクとは異なります。
OneLinkでのディファードディープリンクを設定するには、開発者担当者もAppsFlyerの管理画面へアクセスする必要があります。
ディファードディープリンクの設定は、ディープリンクと同じです。唯一の違いは、ユーザーがアプリをインストールして起動した後に、ユーザーをディープリンクさせてカスタマイズされたコンテンツを提供するために、アプリに追加のロジックを実装する必要がある点です。
詳細については、ディファードディープリンクのガイドを参照してください。
6.4 ディープリンクデータの取得
SDKは、すべてのインストールまたはディープリンクイベントに伴う、コンバージョンデータまたはエンゲージメントデータを提供します。このデータを使用することで、コンテンツとアプリの動作をプログラムしてカスタマイズできます。
ディープリンクが使用され、アプリが直接開かれたときにディープリンクデータを取得するには、onAppOpenAttributionのメソッドを実装してください。
ディープリンクのリエンゲージメントデータをいつでも手動で取得するには、performAppAttributionのメソッドを実装してください。 これにより、新しいリエンゲージメントを記録せずにリエンゲージメントデータにアクセスできます。
詳細については、ディープリンクデータのガイドを参照してください。
6.5 プッシュ通知からのディープリンク処理の設定
addPushNotificationDeepLinkPath
のメソッドを使えば、プッシュ通知のペイロードからディープリンクに必要な情報を取得する方法を、柔軟なインターフェイス上で提供します。
デフォルトの設定では、AppsFlyerのSDK はプッシュ通知のJSON
ペイロード内で af
キーに紐付くディープリンクの値を検索します。しかし、プッシュ通知機能のプロバイダーの多くはSDK側が追加の設定を行わないと解決できない独自の JSON
スキーマを使用しています。
addPushNotificationDeepLinkPath
を使用すると、プッシュ通知のペイロードのどのキーをSDKがディープリンクの値に使用するかを設定できるようになります。
AppsFlyer SDK が想定する、デフォルトのプッシュ通知のJSON
スキーマを使用しないプッシュ通知プロバイダーとアプリを連携する場合には、このメソッドを使用してください。
addPushNotificationDeepLinkPath
を呼び出すと、SDKは以下のことを検証します:
- 必要なキーがペイロード内に存在しているか
- そのキーに有効なOneLink URLが含まれているか
addPushNotificationDeepLinkPath
は、start()
を呼ぶ前に呼び出さなければなりません。
一般的な実装
addPushNotificationDeepLinkPath
の以下の呼び出しと
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
それに紐付くシナリオを確認してください。
シナリオ1
プッシュ通知経由でアプリが起動され、以下のような構造のペイロードが含まれていたとします。
{
...
"deeply": {
"nested": {
"deep_link": "https://yourdeeplink2.onelink.me"
}
}
...
}
この場合、SDKはdeep_link
の値を抽出し、ディープリンクのフローを続行します。
シナリオ2
プッシュ通知経由でアプリが起動され、以下のような構造のペイロードが含まれていたとします。
{
...
"deeply": {
"nested": {
"banana": "https://yourdeeplink2.onelink.me"
}
},
...
}
この場合、呼び出しが実行されても、SDKはペイロード内にdeep_link
のキーを見つけることができず、結果、何も起きません。(=ディープリンクしない)
シナリオ3
プッシュ通知経由でアプリが起動され、以下のような構造のペイロードが含まれていたとします。
{
...
"deeply": {
"nested": {
"deep_link": "Corrupted url or regular string"
}
},
...
}
この場合、SDKはdeep_link
のキーを検出しますが、そのディープリンクの値は無効です。そのため、上記の呼び出しが実行されても何も起こりません。
高度な設定
複数のペイロード構造を設定するには、addPushNotificationDeepLinkPath
を複数回呼び出してください:
- 有効なディープリンクの値を与えた最初のコールが使用されます。
- 他の呼び出しは無視されます。
一致するペイロードの構造がない場合や、有効なOneLink URLがペイロード内に見つからなかった場合には、何も起こりません。
たとえば、以下のペイロードの場合に
{
...
"deeply": {
"nested": {
“deep_link”: “https://yourdeeplink2.onelink.me”
}
},
“this”: {
“is”: {
"banana": "phone"
}
}
...
}
addPushNotificationDeepLinkPath
を呼び出した場合です。
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "deep_link");
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "banana");
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
// this.is.deep_link key isn’t found - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "deep_link");
// this.is.banana key found, but contains invalid OneLink URL - nothing happens
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("this", "is", "banana");
// deeply.nested.deep_link key found and contains valid OneLink URL - proceed deep linking flow
AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath("deeply", "nested", "deep_link");
7. コンバージョンデータの取得
新規インストール毎に、リアルタイムにユーザーの計測データをSDKから直接取得できます。
これにより、ユーザーにパーソナライズされたコンテンツを提供したり、アプリ内の特定のアクティビティに遷移させたりすることができ(このページ内のディファードディープリンクを参照してください。)、ユーザーのアプリへのエンゲージメントを大きく高めることが可能です。
Android SDKからAppsFlyerのコンバージョンデータを取得するには、 AppsFlyerConversionListener
を実装してください。
import android.app.Application;
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerConversionListener;
import java.util.Map;
import android.util.Log;
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, Object> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onConversionDataFail(String errorMessage) {
Log.d("LOG_TAG", "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage);
}
};
AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, getApplicationContext());
AppsFlyerLib.getInstance().start(this);
}
}
import com.appsflyer.AppsFlyerConversionListener
import com.appsflyer.AppsFlyerLib
import com.appsflyer.AppsFlyerLibCore.LOG_TAG
class AFApplication : Application() {
private val devKey = "qrdZGj123456789";
override fun onCreate() {
super.onCreate()
val conversionDataListener = object : AppsFlyerConversionListener{
override fun onConversionDataSuccess(data: MutableMap<String, Any>?) {
data?.let { cvData ->
cvData.map {
Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}")
}
}
}
override fun onConversionDataFail(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
override fun onAppOpenAttribution(data: MutableMap<String, String>?) {
data?.map {
Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}")
}
}
override fun onAttributionFailure(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
}
AppsFlyerLib.getInstance().init(devKey, conversionDataListener, applicationContext)
AppsFlyerLib.getInstance().start(this)
}
}
AppsFlyerConversionListener
のインターフェースで最も重要なAPIは次のとおりです。
-
onInstallConversionData
- 新規インストール時のコンバージョンデータを提供します。
注: SDK ver5以降、onConversionDataSuccess
がコンバージョンデータを取得するメソッドの名称です。5.0.0より前のSDKバージョンを使用している場合、メソッドの名前はonInstallConversionDataLoaded
です。SDK ver 5.0.0にアップデートすることをお勧めします。詳細はこちらを参照してください。 -
onAppOpenAttribution
- 手動またはディープリンクを介してインストール済みのアプリを起動したときに、リターゲティングコンバージョンデータを提供します。
コンバージョンデータの詳細については、コンバージョンデータのシナリオに関するガイドを参照してください。
8. アトリビューション
Google Play以外のAndroidマーケット
AppsFlyerを使用することで、GooglePlay以外のアプリストアで発生したインストールも計測できます。これにより、Google Playを利用できないエリアでも多くのオーディエンスにリーチしてアプリを宣伝可能です。
Google Play以外からのAndroidアプリのインストールを計測する方法の詳細については、, こちらを参照してください。
プリインストールアプリ
プリインストールキャンペーンでは、アプリの所有者は端末の製造元に、出荷前に端末にアプリをプリインストールするように依頼できます。
AppsFlyerを使用することで、プレインストールされたアプリのインストールも簡単に計測できます。ユーザーがアプリを初回起動したとき、AppsFlyerは端末の製造元をメディアソースとしてそのインストールを紐付けてす。
詳細については、こちらをクリックしてください。
アンインストール計測
アンインストール計測の実装方法については、 こちらを参照してください。
request listenerの設定
リクエストがAppsFlyerサーバーで正常に受信されたかどうかを確認したい場合には、AppsFlyerRequestListenerというリスナーを実装してください。
SDKによる個々のアトリビューションリクエストに対して、200のレスポンス
毎にonRequestSuccess()
のコールバックメソッドが実行されます。
それ以外のレスポンスについては onRequestFailure(String error)
のコールバックメソッドが実行され、レスポンスをエラーストリングとして返します。
実装例
AppsFlyerLib.getInstance().start(getApplicationContext(), "devKey", new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully, got 200 response code from server");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().start(this, "devKey", object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
リクエストリスナー中にエラーが発生した場合には、次の表に示すように、エラーコードと文字列での説明が提供されます。
エラーコード | 文字列の説明 |
---|---|
10 |
"Event timeout. Check 'minTimeBetweenSessions' param" |
11 |
"Skipping event because 'isStopped' enabled" |
40 |
Network error: Error description comes from Android |
41 |
"No dev key" |
50 |
"Status code failure" + actual response code from the server |
カスタムデータの追加設定
Segment、Adobe、Urban Airshipなどの外部のパートナープラットフォームとSDKレベルで連携する際には、setAdditionalData
のAPIが必要です。
このAPIは、各プラットフォームの連携のサポートページに、setAdditionalDataのAPIが必要であると記載されている場合にのみ、使用してください。
setAdditionalData
コード例:
HashMap<String,Object> CustomDataMap = new HashMap<>();
CustomDataMap.put("custom_param_1","value_of_param_1");
AppsFlyerLib.getInstance().setAdditionalData(CustomDataMap);
val customDataMap = HashMap<String, Any>()
customDataMap.put("custom_param_1","value_of_param_1")
AppsFlyerLib.getInstance().setAdditionalData(customDataMap)
自社Webサイト(ドメイン)から生まれたアプリ起動の計測
(OneLink以外で)ディープリンクのためにApp Linksを使用し、アプリに関連付けられたドメインを持っている広告主は、appendParametersToDeepLinkingURL
のメソッドを使用することで、それらのドメインを介して開始された起動を計測できます。
たとえば、ユーザーがGoogleで検索し御社のドメイン:www.example.comをクリックしたとします。
- ユーザーがアプリをインストールしていない場合には、そのままWebサイト(www.example.com)に遷移します。
- ユーザーが既にアプリを端末にインストールしている場合には、www.example.comに関連付けられたアプリがディープリンク起動されます。この起動イベントを
appendParametersToDeepLinkingURL
内で指定されたメディアソース (pid
パラメータ)に紐づけて計測することができます。
詳細については、Android SDKのAPIリファレンスを参照してください。
Point: スマートバナーは、Webサイトに訪問したユーザーをアプリユーザーに変換するのにとても役立ちます。
9. セッション
セッション間隔のカスタム設定
デフォルトでは、それぞれ別のセッションとしてカウントされるには、2つのアプリ起動の間隔が少なくとも5秒以上あいている必要があります(詳細は 「セッション数のカウント」を参照してください)。
セッション間の最小時間を設定したい場合には、次のAPIを使用してください:
AppsFlyerLib.setMinTimeBetweenSessions(int seconds);
セッション間のカスタム時間に大きい値を設定すると、ディープリンクなどのセッションデータに依存するAPI へ悪影響を与える可能性があるので注意してください。
ユーティリティ系アプリ向けバックグラウンドセッション
このSDKメソッドを使用することで、ユーザーの新しいセッションを報告できます。たとえば、これはバックグラウンドで実行されるユーティリティアプリなどの場合に便利です。
このAPIを、アクティビティのonCreate(): で使用してください。
public void logSession(Context context);
使用例:
AppsFlyerLib.getInstance().logSession(context);
10. 自社メディア
加工されたDeep Link URLsの解決方法
メールサービスプロバイダー(ESP)などの一部のサードパーティサービスは、独自のクリック計測用ドメインでメール内の計測リンクを変換してしまいます。一方で元々のクリック計測URLを設定できるものもあります。もしもOneLinkがクリック計測用に変換された場合、OneLinkの機能が制限される可能性があります。
この問題を解決するには、 setResolveDeepLinkURLs
のAPIを使用してください。このAPIを使用することで、アプリを起動するクリックドメインからOneLinkを取得することが可能です。このAPIはSDK初期化よりも前に必ず呼び出してください。
たとえば、あなたのOneLink(https://mysubdomain.onelink.me/abCD)にリダイレクトする3つのクリックドメインがあったときにも、このAPIを使用することで、そのクリックドメインたちがリダイレクトするOneLinkを取得可能です。このAPIメソッドはSDKが分析するクリックドメインのリストを受け取ります。SDK初期化の前に以下のコードを追加してください。
AppsFlyerLib.getInstance().setResolveDeepLinkURLs("clickdomain.com", "myclickdomain.com", "anotherclickdomain.com");
上記のコードを使用すると、OneLinkの機能を維持しながらクリックドメインを使用できます。そのクリックドメインは、アプリの起動を担います。このAPIは、順番に、これらのクリックドメインからOneLinkを取得し、そのデータを使ってカスタマイズされたユーザーコンテンツへのディープリンクを可能にします。
プッシュ通知の計測
AppsFlyerでは、リターゲティングキャンペーンの一部として、プッシュ通知を計測できます。
この機能を有効にするには、通知をクリックした後に起動されるすべてのアクティビティの onCreate
メソッド内で sendPushNotificationData
メソッドを呼び出してください。
AppsFlyerLib.getInstance().sendPushNotificationData(this);
プッシュ通知の計測に関する詳細は、こちらを参照してください。
ユーザー招待アトリビューション
アプリの既存ユーザーがアプリに友人を招待できるようにすることが、アプリインストール増加のきっかけとなる場合があります。AppsFlyerを使用することで、アプリ内のユーザー招待から発生したインストールの計測を行うことが可能です。
詳細は、ユーザー招待の計測のガイドを参照してください。
クロスプロモーションの計測
詳細はクロスプロモーション計測のページを参照してください。
11. ユーザー識別子
AppsFlyer IDの取得
AppsFlyer IDは、アプリのインストール毎に都度発行されます。AppsFlyer IDはさまざまな目的で使用できます。
- サーバー間(S2S)イベントを送信するとき
- 広告主側で持っているシステム上のユーザー情報と一致させるとき
- Pull APIとPush APIのデータをマージして、各データを突合させるとき
次のAPIを使用してAppsFlyer IDを取得してください。
public String getAppsFlyerUID(Context context);
使用例:
String appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
カスタマーユーザーIDの設定
カスタマーユーザーIDを設定するには:
public void setCustomerUserId(String id);
使用例:
AppsFlyerLib.getInstance().setCustomerUserId("myId");
設定された後に計測されたイベントにしかカスタマーユーザーIDを紐付けられないので、AppsFlyerでは、 アプリ利用の一連の流れの中で、できる限り早いタイミングでカスタマーユーザーIDを設定することをお勧めしています。
start
を呼び出す前にsetCustomerUserId
が呼び出された場合には、インストールおよびイベントのローデータレポートにカスタマーユーザーIDが表示されます。- trackAppLaunchよりも後に設定された場合には、カスタマーユーザーIDはその設定後に計測されたイベントへのみ紐付けられます。
カスタマーユーザーIDの取得
最初の起動後にカスタマーユーザーIDの値を再度設定したり、IDを取得する通信をあなたのサーバーに必要以上にしないように、以下のコードを使用してIDの値が空かどうかを確認できます。
AppsFlyerProperties.getInstance().getString(AppsFlyerProperties.APP_USER_ID)
カスタマーユーザーIDの詳細については、こちらをクリックしてください。
customerUserIDのためのSDK初期化の遅延
customerUserIDが設定されるまで、SDKの初期化を遅らせることも可能です。
customerUserIDの呼び出しのためにSDKの初期化を遅らせる必要があることを示すには:
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
を呼び出します。SDK初期化の残りの部分は変更しません。
customerUserIDが指定されたら、
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
関連するCustomer User IDをSDKに提供してSDKでの計測を開始します。
コードは次のようになります。
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionDataListener =
new AppsFlyerConversionListener() {
...
};
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(AF_DEV_KEY, getConversionListener(), getApplicationContext());
AppsFlyerLib.getInstance().start(this);
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
//Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
}
}
class AFApplication: Application() {
private val afDevKey = ""
override fun onCreate() {
super.onCreate()
val conversionDataListener = object: AppsFlyerConversionListener {
...
}
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(afDevKey, conversionDataListener, this)
AppsFlyerLib.getInstance().start(this)
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
// Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this)
}
}
カスタマーユーザーIDが利用可能になるまでSDKの初期化を遅らせる方法の詳細については、こちらを参照してください。
警告
ビジネスロジックに適している場合に限り、このAPIを使用してください。このAPIを使用すると、数値の乖離が発生する可能性が高くなるだけでなく、アプリに対して不正が行われる可能性も高くなります。
Googleの広告ID
SDKバージョン4.8.0以降、AppsFlyerはgoogle_advertising_id
を自動的に収集します。
Google Advertising IDを収集する要件は、バージョン4.7.X以前のSDKにのみ関連します。
OAID、IMEI、Android ID
計測を有効にするには、少なくとも1つのユニークな端末識別子を収集する必要があり、以下の識別子が使用可能です。:GAID / Android ID / IMEI / OAID
GAID - Google Advertising ID
Google Play 開発者サービスを含んでいるアプリからは自動的に収集されます。 GAIDが利用可能な場合には、Google Playポリシーを違反しないために、IMEIおよびAndroid IDはアプリで収集しないでください 。
IMEIとAndroid ID
デフォルトでは無効になっています。 Google Play 開発者サービスを含まないアプリについてのみ収集できます。
注: 2019年後半にリリースされた Android 10(APIレベル29) から、IMEIパラメーターへのアクセスが制限されています。
これらのIDをAppsFlyerに送信するには:
- アプリを開いて、端末のIMEIやAndroid IDを収集します。
start
のメソッドを呼び出す前に、次のAPIを呼び出してください。
AppsFlyerLib.getInstance().setImeiData("IMEI_HERE"); AppsFlyerLib.getInstance().setAndroidIdData("ANDROID_ID_HERE");
OAID - Open Advertiser Identifier
端末ID収集のオプトアウト
開発者は、次のAPIを使用してIMEI、Android ID、OAIDの収集をオプトアウトすることも可能です。
AppsFlyerLib.getInstance().setCollectIMEI(false);
AppsFlyerLib.getInstance().setCollectAndroidID(false);
AppsFlyerLib.getInstance().setCollectOaid(false);
12. ユーザープライバシー
オプトアウト
稀ではあっても場合によっては、法律やプライバシー遵守のために、すべてのSDKにおける計測を停止しなければならないケースがあるかと思います。その場合、stop
のAPIを利用可能です。このAPIが呼び出されると、AppsFlyerのSDKは動作を停止し、AppsFlyerサーバーとの通信は何も発生しなくなります。
AppsFlyerLib.getInstance().stop(true, getApplicationContext());
AppsFlyerLib.getInstance().stop(true, applicationContext);
ユーザーのオプトアウトには、さまざまなシナリオがあります。AppsFlyerでは、アプリに適したシナリオにあわせて正しい手順を守り、実装するよう推奨します。
SDK を再アクティブ化するには、以下を呼び出してください:
AppsFlyerLib.getInstance().stop(false,getApplicationContext());
AppsFlyerLib.getInstance().start(getApplicationContext(),<AF_DEV_KEY>);
AppsFlyerLib.getInstance().stop(false,applicationContext);
AppsFlyerLib.getInstance().start(applicationContext,<AF_DEV_KEY>);
stop
がtrue
に設定されている場合には、start
を呼び出さないでください。以下のメソッドを呼び出すことで、SDKの現在の状態を確認可能です:
AppsFlyerLib.getInstance().isStopped()// returns true if SDK is stopped, false otherwise
AppsFlyerLib.getInstance().isStopped// returns true if SDK is stopped, false otherwise
警告
このstop APIは、当該ユーザーに関する全計測において、一切計測しないという対応が必要な場合にのみ使用してください。このAPIの使用は、各種計測やデータ取得、ディープリンクの機能に大きな影響を与えますのでご注意ください。
ユーザーデータの匿名化
ユーザーのインストール、イベント、セッションの計測を明示的に匿名化するには、SDKの初期化中にこのAPIを使用してください。
public void anonymizeUser(boolean isDisabled);
使用例:
AppsFlyerLib.getInstance().anonymizeUser(true);
anonymizeUser
を false に設定することで、データの計測を再開できます。
警告
ユーザーを匿名化することにより、アトリビューションの計測に大きな悪影響があります。ユーザーの情報を収集することが法的に禁じられている地域でのみ、このオプションを使用してください。
データ取得からのパートナーの除外
場合によっては、アドネットワークやパートナーに対する特定ユーザーのユーザーレベルのデータ共有を停止したい場合があるかと思います。その理由としては:
- CCPAやGDPRのようなプライバシーポリシー
- ユーザーによるオプトアウト
- 一部パートナー(広告ネットワーク/第三者ツール)との競合
AppsFlyerでは、一部またはすべてのパートナーとのデータ共有を停止するための、2つのAPIメソッドを用意しています。
- setSharingFilter: 広告主がデータ取得から 特定の アドネットワークや連携パートナーを 除外する ために使用するものです。
- setSharingFilterForAllPartners: 広告主が すべての アドネットワーク / 連携パートナーに対して、データを共有しないようにするために使用します。
これらのフィルタリングメソッドは、SDK V5.4.1からサポートされています。
このフィルタリングメソッドは、SDK が初期化される毎に呼び出される必要があり、セッション全体に影響を与えます。 このフィルタを設定する必要があるかどうかを判断するのに時間がかかる場合には、SDKの初期化を遅延させてください。
最初のstartの呼び出しよりも前に、このメソッドがアクティブ化された場合 :
- SRN経由のユーザーはOrganicユーザーと見なされ、そのユーザーのデータは連携パートナーとも共有されません。
- 通常のアドネットワーク(SRN以外)経由のユーザー は、AppsFlyer上で正しく媒体へ紐付けされますが、ポストバック、API、ローデータレポート、またはその他の方法においてアドネットワークへデータは共有されません。
現在、これらのメソッドを使用してアンインストールに関するデータをフィルタリングすることはできませんが、AppsFlyerの 連携設定ページ を使用して、各パートナーへのアンインストールイベントのポストバック送信は停止することができます。
Android SDKのAPI Reference
getAppsFlyerUID
説明 |
AppsFlyer IDの取得詳細は、こちらをご確認ください。 |
メソッドのシグネチャ |
|
使用例 |
|
onAppOpenAttribution
説明 |
アプリがディープリンク起動されたときに、ディープリンクのデータを取得します。 |
メソッドのシグネチャ |
|
onAttributionFailure
説明 |
ディープリンクデータを取得する際のエラーを処理します。 |
メソッドのシグネチャ |
|
onConversionDataSuccess
説明 |
インストール後にそのインストールのコンバージョンデータを取得します。ディファードディープリンクに役立ちます。 注:SDK |
メソッドのシグネチャ |
|
onConversionDataFail
説明 |
インストールのコンバージョンデータを取得できない時のエラーを処理します。 |
メソッドのシグネチャ |
|
onDeepLinking
説明 |
アプリが開かれたらすぐに、アプリのインストールの有無に関係なく、特定のアプリ内アクティビティにユーザーを遷移させます。詳細はこちら |
メソッドのシグネチャ |
|
onRequestFailure
説明 |
AppsFlyerRequestListenerのためのコールバックメソッドです。SDKがアプリの起動計測に失敗したときに呼ばれます。 |
メソッドのシグネチャ |
|
使用例: |
request listenerの設定を参照してください。 |
onRequestSuccess
説明 |
AppsFlyerRequestListenerのためのコールバックメソッドです。SDKがアプリの起動計測に成功したときに呼ばれます。 |
メソッドのシグネチャ |
|
使用例: |
request listenerの設定を参照してください。 |
performOnAppAttribution
説明 |
開発者は、function allows developers to manually re-trigger onAppOpenAttribution with a specific link (URI or URL), 新しいリエンゲージメントが記録されない場合においても、特定のリンク(URLまたはURI)を使用してonAppOpenAttributionを手動で再度発火させることが可能です。 このメソッドは、与えられたURLに基づいてユーザーをアプリ内にリダイレクトさせる必要がある場合や、 フォアグラウンド / アプリを開いたままの状態でAppsFlyerの短縮URLをresolveする必要がある場合などに必要になる場合があります。 通常、 アプリがディープリンクで開かれた場合にのみ、onAppOpenAttributionのコールバックが呼び出されるため、このAPIが必要になる可能性があります。 |
メソッドのシグネチャ |
|
使用例: |
|
logSession
説明 |
アプリがバックグラウンドでも実行されるユーティリティアプリなどの場合に、セッションを記録します。 |
メソッドのシグネチャ |
|
使用例: |
|
sendDeepLinkData (V5.3.0 から非推奨)
説明 |
このメソッドは、ユーザーが特定のアクティビティにディープリンクされていても、アトリビューションデータを確実に取得するために使用されなくなりました。代わりに、start () が呼び出されていることを確認してください。 詳細については、こちらをご確認ください。 |
メソッドのシグネチャ |
|
使用例: |
|
sendPushNotificationData
説明 |
プッシュ通知キャンペーンからデータを測定して取得します。詳細については、 プッシュ通知の計測を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setAdditionalData
説明 |
外部のパートナープラットフォームに送信されるデータを追加します。 |
メソッドのシグネチャ |
|
使用例: |
追加データの設定を参照してください。 |
setAndroidIdData
説明 |
Android IDをAppsFlyerに送信します。 OAID、IMEI、Android ID を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setAppInviteOneLink
説明 |
ユーザー招待用のカスタム計測リンクの作成に使用される、OneLinkテンプレートのIDを設定します。 |
メソッドのシグネチャ |
|
使用例: |
ユーザー招待の計測におけるOneLink設定を参照してください。 |
setCollectAndroidID
説明 |
Android IDをAppsFlyerに送信するかどうかを指定します。 |
メソッドのシグネチャ |
|
使用例: |
OAID、IMEI、Android ID を参照してください。 |
setCollectIMEI
説明 |
IMEIをAppsFlyerに送信するかどうかを指定します。 |
メソッドのシグネチャ |
|
使用例: |
OAID、IMEI、Android ID を参照してください。 |
setCustomerIdAndLogSession
説明 |
Customer User IDが利用可能になると、SDKを初期化します。詳細については、 Customer User IDのためのSDK初期化の遅延 を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setCustomerUserId
説明 |
カスタマーユーザーIDを設定します。詳細については、カスタマーユーザーIDの設定を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setDebugLog
説明 |
デバッグログを有効にします。Androidのデバッグを参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
anonymizeUser
説明 |
ユーザーのインストール、イベント、およびセッションを匿名化します。より詳細は、 こちらを参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setLogLevel
説明 |
AppsFlyer SDK ログレベルを設定します。 |
メソッドのシグネチャ |
|
使用例: |
|
setMinTimeBetweenSessions
説明 |
セッション間の最小時間を設定します。詳細についてはセッション間のカスタム時間を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setOaidData
説明 |
OAIDをAppsFlyerに送信します。 OAID、IMEI、Android ID を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setOutOfStore
説明 |
アプリのダウンロード元となったアプリストア(GooglePlay以外)を指定します。 |
メソッドのシグネチャ |
|
使用例: |
|
setPartnerData
説明 |
パートナーと広告主側で、SDK イベントにデータを追加できるようになります。 |
メソッドのシグネチャ |
|
使用例: |
|
setPreinstallAttribution
説明 |
プリインストールされたアプリの初回起動時に、そのプリインストールを計測するようにSDKを設定します。 |
メソッドのシグネチャ |
|
使用例: |
Androidのプリインストールキャンペーンを参照してください。 |
setResolveDeepLinkURLs
説明 |
クリックドメインからのOneLinkを解決します。詳細については、 変換されたディープリンクURLの解決方法を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setSharingFilter
説明 |
広告主がデータ共有から除外するアドネットワーク/連携パートナーを設定するために使用します 。 詳細はこちらを参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
setSharingFilterForAllPartners
説明 |
広告主がすべてのアドネットワーク/連携パートナーに対して、データを共有しないようにするために使用します。 詳細はこちらを参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
start
説明 |
アプリの起動時にSDKを開始します。詳細については、 SDKの初期化を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
stop
説明 |
すべてのSDK機能をシャットダウンします。詳細は、「 ユーザープライバシー:オプトアウト 」を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
trackAppLaunch (V5.2.0から非推奨)
説明 |
このメソッドは非推奨です。代わりにstartを使用してください。 2つの機能があります。
|
メソッドのシグネチャ |
|
使用例: |
|
logEvent
説明 |
アプリ内イベントのAppsFlyerへの送信詳細については、 アプリ内イベントの計測を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
updateServerUninstallToken
説明 |
アンインストール計測以外の目的でFirebaseを使用している開発者向けです。詳細については、 アンインストール計測を参照してください。 |
メソッドのシグネチャ |
|
使用例: |
|
waitForCustomerUserId
説明 |
Customer User IDが設定されるまでSDKの初期化を遅らせます。 |
メソッドのシグネチャ |
|
使用例: |
|
appendParametersToDeepLinkingURL
説明 |
OneLinKは使用せず、ディープリンク用のApp Linksを使用して、アプリに関連付けられたドメイン経由で開始させたセッションを計測できるようになります。startを呼び出す前に、このメソッドを呼び出してください。
|
メソッドのシグネチャ |
|
使用例: |
|
addPushNotificationDeepLinkPath
説明 |
SDKがプッシュ通知のペイロードからディープリンクの値を抽出する方法を設定してください。 |
メソッドのシグネチャ |
|
使用例: |
この呼び出しは、以下のペイロードの構造と一致します:
|
非推奨のAPI
非推奨のAPIとは、そのメソッドが今後別のものに置き換えられることを意味しています。コードを更新する目安として開発者の方はご活用ください。
サポート終了日の日付に、そのメソッドは機能しなくなるか、もしくはその一部が制限された状態で機能するようになります。
API / interface 名 | 非推奨となったバージョン | サポート終了日 | 変更後 |
---|---|---|---|
trackAppLaunch |
5.2.0 |
2020-10-14 |
|
sendDeepLinkData |
5.3.0 |
2020-10-14 |
|
stopTracking |
6.0.0 |
|
stop |
setCustomerIdAndTrack |
6.0.0 |
|
setCustomerIdAndLogSession |
startTracking |
6.0.0 |
|
start |
trackLocation |
6.0.0 |
|
logLocation |
reportTrackSession |
6.0.0 |
|
logSession |
trackEvent |
6.0.0 |
|
logEvent |
setDeviceTrackingDisabled |
6.0.0 |
|
anonymizeUser |
validateAndTrackInAppPurchase |
6.0.0 |
|
validateAndLogInAppPurchase |
isStopTracking |
6.0.0 |
|
isStopped |
trackAndOpenStore |
6.0.0 |
|
logAndOpenStore |
trackCrossPromoteImpression |
6.0.0 |
|
logCrossPromoteImpression |
trackInvite |
6.0.0 |
|
logInvite |
AppsFlyerTrackingRequestListener |
6.0.0 |
|
AppsFlyerRequestListener |
コメント
サインインしてコメントを残してください。