アプリ内イベント
概要
開発者向けのアプリ内イベントについての概要については、 アプリ内イベント をご覧ください。
始める前に
SDKを実装する必要があります。
アプリ内イベントの記録
SDKでは、アプリで発生したユーザーアクションを記録できます。これは、一般的にアプリ内イベントと呼ばれます。
The logEvent
method
logEvent
methodlogEvent
メソッドを使用すると、アプリ内イベントをログに記録し、AppsFlyerに送信して処理することができます。
logEvent
メソッドにアクセスするには、AppsFlyerLib
をインポートしてください:
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerLib
既定のイベント定数にアクセスするには、AFInAppEventType
と AFInAppEventParameterName
をインポートしてください:
import com.appsflyer.AFInAppEventType; // Predefined event names
import com.appsflyer.AFInAppEventParameterName; // Predefined parameter names
import com.appsflyer.AFInAppEventType // Predefined event names
import com.appsflyer.AFInAppEventParameterName // Predefined parameter names
logEvent
は4つの引数を取ります。
void logEvent(Context context,
java.lang.String eventName,
java.util.Map<java.lang.String,java.lang.Object> eventValues,
AppsFlyerRequestListener listener)
- 第1引数(
context
)はApplication/Activity Contextです - 第2引数(
eventName
)はアプリ内イベント名です - 第3引数(
eventValues
)は、イベントパラメーターのMap
です。 - 第4引数(
listener
)は、オプションのAppsFlyerRequestListener
(イベント送信の成功/失敗に有効)です。
Example: Send "add to wishlist" event
例えば、ユーザーが商品をウィッシュリストに追加したことを記録する方法は次のとおりです:
Map<String, Object> eventValues = new HashMap<String, Object>();
eventValues.put(AFInAppEventParameterName.PRICE, 1234.56);
eventValues.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
AFInAppEventType.ADD_TO_WISHLIST , eventValues);
val eventValues = HashMap<String, Any>()
eventValues.put(AFInAppEventParameterName.PRICE, 1234.56)
eventValues.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() ,
AFInAppEventType.ADD_TO_WISHLIST , eventValues)
上記の logEvent
呼び出しでは:
- イベント名は、
AFInAppEventType.ADD_TO_WISHLIST
- イベント値は、次のイベントパラメーターを含む
Map
:- AFInAppEventParameterName.PRICE:イベントに紐づく価格
- AFInAppEventParameterName.CONTENT_ID:追加された商品の識別子
Implementing event structure definitions
イベント構成の定義にて提供されている定義の例に基づいて、イベントは次のように実装する必要があります。
Map<String, Object> eventValues = new HashMap<String, Object>();
eventValues.put(AFInAppEventParameterName.PRICE, <ITEM_PRICE>);
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, <ITEM_TYPE>);
eventValues.put(AFInAppEventParameterName.CONTENT_ID, <ITEM_SKU>);
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
AFInAppEventType.CONTENT_VIEW, eventValues);
val eventValues = HashMap<String, Any>()
eventValues.put(AFInAppEventParameterName.PRICE, <ITEM_PRICE>)
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, <ITEM_TYPE>)
eventValues.put(AFInAppEventParameterName.CONTENT_ID, <ITEM_SKU>)
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
AFInAppEventType.CONTENT_VIEW, eventValues)
Handling event submission success and failure
アプリ内イベントの記録時に、logEvent
を AppsFlyerRequestListener
オブジェクトと一緒に提供することができます。このハンドラーを使用すると、次の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)
}
})
アプリ内イベントの記録時にエラーが発生した場合には、次の表のようにエラーコードと文字列での説明が提供されます。
エラーコード | 説明 (NSError) |
---|---|
10 | "Event timeout. Check 'minTimeBetweenSessions' param" |
11 | "Skipping event because 'isStopTracking' enabled" |
40 | ネットワークエラー:Android経由のエラーの説明 |
41 | "No dev key" |
50 | "Status code failure" + サーバーからの実際のエラーコード |
Recording offline events
SDKはインターネットに接続されていないときに発生するイベントを記録することができます。詳細はオフライン時のアプリ内イベントを参照してください。
Logging events before calling start
start
SDKを初期化したが、start
を呼び出さなかった場合、SDKは start
が呼び出されるまでアプリ内イベントをキャッシュします。
キャッシュに複数のイベントがある場合は、それらは次々とサーバーに送信されます(非バッチ、イベント毎に1つのネットワークリエスト)。
収益の記録
収益の情報は、どのアプリ内イベントでも送信できます。AFInAppEventParameterName.REVENUE
イベントパラメーターを使用して、アプリ内イベントに収益を含めてください。正負を問わず、あらゆる数値を入力できます。
コンマの値区切り、通貨記号、テキストなどは収益の値に含めないでください。たとえば、収益の値は「1234.56」のように設定してください。
Example: Purchase event with revenue
Map<String, Object> eventValues = new HashMap<String, Object>();
eventValues.put(AFInAppEventParameterName.CONTENT_ID, <ITEM_SKU>);
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, <ITEM_TYPE>);
eventValues.put(AFInAppEventParameterName.REVENUE, 200);
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>()
eventValues.put(AFInAppEventParameterName.CONTENT_ID, <ITEM_SKU>)
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, <ITEM_TYPE>)
eventValues.put(AFInAppEventParameterName.REVENUE, 200)
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
AFInAppEventType.PURCHASE, eventValues)
上記の購入イベントの収益は200ドルで、管理画面にも収益として表示されます。
注意
収益値に通貨記号を含めないでください。
Configuring revenue currency
af_currency
という既定のイベントパラメーターを使用して、イベントの収益に対する通貨コードを設定できます。
Map<String, Object> eventValues = new HashMap<String, Object>();
eventValues.put(AFInAppEventParameterName.CURRENCY, "USD");
eventValues.put(AFInAppEventParameterName.REVENUE, <TRANSACTION_REVENUE>);
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>()
eventValues.put(AFInAppEventParameterName.REVENUE, <TRANSACTION_REVENUE>)
eventValues.put(AFInAppEventParameterName.CURRENCY,"USD")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValues)
- 通貨コードは3桁のISO 4217コードを使用してください。
- デフォルトの通貨はUSDです
通貨単位の設定、管理画面上での表示、通貨換算については、収益通貨に関するガイドをご覧ください。
Logging negative revenue
稀に、マイナスの収益を計測したいケースがあるかと思います。たとえば、ユーザーは払い戻しを受け取ったり、サブスクリプションをキャンセルしたときです。
マイナスの収益を記録する方法:
Map<String, Object> eventValues = new HashMap<String, Object>();
eventValues.put(AFInAppEventParameterName.REVENUE, -1234.56);
eventValues.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
"cancel_purchase",
eventValues);
val eventValues = HashMap<String, Any>()
eventValues.put(AFInAppEventParameterName.REVENUE, -1234.56)
eventValues.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
"cancel_purchase",
eventValues)
注意
上記のコードについて次のことに注意してください。
- 収益値の前にはマイナス記号が追加されています
- イベント名は、"cancel_purchase" というカスタムイベント名です。管理画面やローデータレポートで、収益がマイナスのイベントを簡単に特定するのに役立ちます。
購入の検証
AppsFlyerは、アプリ内購入をサーバーにて検証できます。validateAndLogInAppPurchase
メソッドは購入イベントの検証とログを行います。
The validateAndLogInAppPurchase
method
validateAndLogInAppPurchase
methodvalidateAndLogInAppPurchase
は AppsFlyerLib
経由で公開されます。
validateAndLognInAppPurchase
はこれらの引数を取ります:
validateAndLogInAppPurchase(Context context,
java.lang.String publicKey,
java.lang.String signature,
java.lang.String purchaseData,
java.lang.String price, java.lang.String currency,
java.util.Map<java.lang.String,java.lang.String> additionalParameters)
context
:Application / Activity コンテクストpublicKey
:Google Play Consoleから取得したLicense Keysignature
:onActivityResult
からのdata.INAPP_DATA_SIGNATURE
purchaseData
:onActivityResult
からのdata.INAPP_PURCHASE_DATA
price
:購入価格。次から取得:skuDetails.getStringArrayList("DETAILS_LIST")
currency
:購入通貨。次から取得:skuDetails.getStringArrayList("DETAILS_LIST")
additionalParameters
:記録する追加イベントパラメーター
検証が成功した場合、af_purchase
イベントが validateAndLogInAppPurchase
に提供された値と共に記録されます。
注意
validateAndLogInAppPurchase
generates anaf_purchase
in-app event upon successful validation. Sending this event yourself will cause duplicate event reporting.
Example: Validate an in-app purchase
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private void handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
Map<String, String> eventValues = new HashMap<>();
eventValues.put("some_parameter", "some_value");
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(getApplicationContext(),
PUBLIC_KEY,
purchase.getSignature(),
purchase.getOriginalJson(),
"10",
"USD",
eventValues);
}
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private fun handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!")
val eventValues = HashMap<String, String>()
eventValues.put("some_parameter", "some_value")
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(this,
PUBLIC_KEY,
purchase.getSignature(),
purchase.getOriginalJson(),
"10",
"USD",
eventValues)
}
Handling purchase validation success/failure
AppsFlyerInAppPurchaseValidatorListener
を使用して購入検証の成功/失敗をサブスクライブし、registerValidatorListener
を使用して Application クラスに登録します。
registerValidatorListener
は AppsFlyerLib
経由で公開されます。AppsFlyerInAppPurchaseValidatorListener
を使用するには、インポートしてください:
import com.appsflyer.AppsFlyerInAppPurchaseValidatorListener;
import com.appsflyer.AppsFlyerInAppPurchaseValidatorListener
AppsFlyerInAppPurchaseValidatorListener
には2つのコールバックがあります:
onValidateInApp
:購入の認証が成功したときに発生しますonValidateInAppFailure
:購入の検証に失敗した場合に発生します
registerValidatorListener
は2つの引数を取ります。
context
:Application ContextvalidationListener
:登録したいAppsFlyerInAppPurchaseValidatorListener
オブジェクト
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")
}
})
アプリ内購入を検証するとアプリ内イベントが自動的に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
}
イベント定数
Predefined event names
次のコンスタントを使用するには、com.appsflyer.AFInAppEventType をインポートしてください。
import com.appsflyer.AFInAppEventType;
import com.appsflyer.AFInAppEventType
既定のイベント名の定数は、AFInAppEventType.EVENT_NAME
の命名規則に従います。例:AFInAppEventType.ADD_TO_CART
イベント名 | Android 定数名 | |
---|---|---|
"af_level_achieved" | AFInAppEventType.LEVEL_ACHIEVED | |
"af_add_payment_info" | AFInAppEventType.ADD_PAYMENT_INFO | |
"af_add_to_cart" | AFInAppEventType.ADD_TO_CART | |
"af_add_to_wishlist" | AFInAppEventType.ADD_TO_WISHLIST | |
"af_complete_registration" | AFInAppEventType.COMPLETE_REGISTRATION | |
"af_tutorial_completion" | AFInAppEventType.TUTORIAL_COMPLETION | |
"af_initiated_checkout" | AFInAppEventType.INITIATED_CHECKOUT | |
"af_purchase" | AFInAppEventType.PURCHASE | |
"af_rate" | AFInAppEventType.RATE | |
"af_search" | AFInAppEventType.SEARCH | |
"af_spent_credits" | AFInAppEventType.SPENT_CREDITS | |
"af_achievement_unlocked" | AFInAppEventType.ACHIEVEMENT_UNLOCKED | |
"af_content_view" | AFInAppEventType.CONTENT_VIEW | |
"af_list_view" | AFInAppEventType.LIST_VIEW | |
"af_travel_booking" | AFInAppEventType.TRAVEL_BOOKING | |
"af_share" | ||
"af_invite" | AFInAppEventType.INVITE | |
"af_login" | AFInAppEventType.LOGIN | |
"af_re_engage" | AFInAppEventType.RE_ENGAGE | |
"af_update" | AFInAppEventType.UPDATE | |
"af_location_coordinates" | AFInAppEventType.LOCATION_COORDINATES | |
"af_customer_segment" | AFInAppEventType.CUSTOMER_SEGMENT | |
"af_subscribe" | AFInAppEventType.SUBSCRIBE | |
"af_start_trial" | AFInAppEventType.START_TRIAL | |
"af_ad_click" | AFInAppEventType.AD_CLICK | |
"af_ad_view" | AFInAppEventType.AD_VIEW | |
"af_opened_from_push_notification" | AFInAppEventType.OPENED_FROM_PUSH_NOTIFICATION |
Predefined event parameters
次の定数を使用するには、AFInAppEventParameterName
をインポートしてください:
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventParameterName
既定のイベントパラメーターの定数は、AFInAppEventParameterName.PARAMETER_NAME
の命名規則に従います。例:AFInAppEventParameterName.CURRENCY
イベントパラメーター名 | Android 定数名 | タイプ |
---|---|---|
"af_content" | CONTENT | String |
"af_achievement_id" | ACHIEVEMENT_ID | String |
"af_level" | LEVEL | String |
"af_score" | SCORE | String |
"af_success" | SUCCESS | String |
"af_price" | PRICE | float |
"af_content_type" | CONTENT_TYPE | String |
"af_content_id" | CONTENT_ID | String |
"af_content_list" | CONTENT_LIST | String |
"af_currency" | CURRENCY | float |
"af_quantity" | QUANTITY | int |
"af_registration_method" | REGISTRATION_METHOD | String |
"af_payment_info_available" | PAYMENT_INFO_AVAILABLE | String |
"af_max_rating_value" | MAX_RATING_VALUE | String |
"af_rating_value" | RATING_VALUE | String |
"af_search_string" | SEARCH_STRING | String |
"af_date_a" | DATE_A | String |
"af_date_b" | DATE_B | String |
"af_destination_a" | DESTINATION_A | String |
"af_destination_b" | DESTINATION_B | String |
"af_description" | DESCRIPTION | String |
"af_class" | CLASS | String |
"af_event_start" | EVENT_START | String |
"af_event_end" | EVENT_END | String |
"af_lat" | LAT | String |
"af_long" | LONG | String |
"af_customer_user_id" | CUSTOMER_USER_ID | String |
"af_validated" | VALIDATED | boolean |
"af_revenue" | REVENUE | int |
"af_projected_revenue" | PROJECTED_REVENUE | int |
"af_receipt_id" | RECEIPT_ID | String |
"af_tutorial_id" | TUTORIAL_ID | String |
"af_virtual_currency_name" | VIRTUAL_CURRENCY_NAME | String |
"af_deep_link" | DEEP_LINK | String |
"af_old_version" | OLD_VERSION | String |
"af_new_version" | NEW_VERSION | String |
"af_review_text" | REVIEW_TEXT | String |
"af_coupon_code" | COUPON_CODE | String |
"af_order_id" | ORDER_ID | String |
"af_param_1" | PARAM_1 | String |
"af_param_2" | PARAM_2 | String |
"af_param_3" | PARAM_3 | String |
"af_param_4" | PARAM_4 | String |
"af_param_5" | PARAM_5 | String |
"af_param_6" | PARAM_6 | String |
"af_param_7" | PARAM_7 | String |
"af_param_8" | PARAM_8 | String |
"af_param_9" | PARAM_9 | String |
"af_param_10" | PARAM_10 | String |
"af_departing_departure_date" | DEPARTING_DEPARTURE_DATE | String |
"af_returning_departure_date" | RETURNING_DEPARTURE_DATE | String |
"af_destination_list" | DESTINATION_LIST | String[] |
"af_city" | CITY | String |
"af_region" | REGION | String |
"af_country" | COUNTRY | String |
"af_departing_arrival_date" | DEPARTING_ARRIVAL_DATE | String |
"af_returning_arrival_date" | RETURNING_ARRIVAL_DATE | String |
"af_suggested_destinations" | SUGGESTED_DESTINATIONS | String[] |
"af_travel_start" | TRAVEL_START | String |
"af_travel_end" | TRAVEL_END | String |
"af_num_adults" | NUM_ADULTS | String |
"af_num_children" | NUM_CHILDREN | String |
"af_num_infants" | NUM_INFANTS | String |
"af_suggested_hotels" | SUGGESTED_HOTELS | String[] |
"af_user_score" | USER_SCORE | String |
"af_hotel_score" | HOTEL_SCORE | String |
"af_purchase_currency" | PURCHASE_CURRENCY | String |
"af_preferred_neighborhoods" | PREFERRED_NEIGHBORHOODS | String[] |
"af_preferred_num_stops" | PREFERRED_NUM_STOPS | String |
"af_adrev_ad_type" | AD_REVENUE_AD_TYPE | String |
"af_adrev_network_name" | AD_REVENUE_NETWORK_NAME | String |
"af_adrev_placement_id" | AD_REVENUE_PLACEMENT_ID | String |
"af_adrev_ad_size" | AD_REVENUE_AD_SIZE | String |
"af_adrev_mediated_network_name" | AD_REVENUE_MEDIATED_NETWORK_NAME | String |
"af_preferred_price_range" | PREFERRED_PRICE_RANGE | String 、次のようにフォーマットされたint tuple: (min,max) |
"af_preferred_star_ratings" | PREFERRED_STAR_RATINGS | String 、次のようにフォーマットされたint tuple: (min,max) |
更新済 26日前