Eventos in-app

Visão Geral

Para obter uma introdução aos eventos in-app para desenvolvedores, consulte Eventos in-app.

Antes de começar

Você deve integrar o SDK.

Registrando eventos in-app

O SDK permite registrar ações do usuário que acontecem no contexto do aplicativo. Eles geralmente são chamados de eventos in-app.

The logEvent method

The logEvent method lets you log in-app events and send them to AppsFlyer for processing.

To access the logEvent method, import AppsFlyerLib:

import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerLib

To access predefined event constants, import AFInAppEventType and 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 pega 4 argumentos:

void logEvent(Context context,
              java.lang.String eventName,
              java.util.Map<java.lang.String,java.lang.Object> eventValues,
              AppsFlyerRequestListener listener)
  • The first argument (context) is the Application/Activity Context
  • The second argument (eventName) is the In-app event name
  • The third argument (eventValues) is the event parameters Map
  • The fourth argument (listener) is an optional AppsFlyerRequestListener (useful for Handling event submission success/failure)

Example: Send "add to wishlist" event

Por exemplo, para registrar que um usuário adicionou um item à lista de desejos:

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)

In the above logEvent invocation:

Implementing event structure definitions

Com base na definição de exemplo fornecida em Compreendendo as definições da estrutura de eventos, o evento deve ser implementado da seguinte forma:

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

You can provide logEvent with a AppsFlyerRequestListener object when recording in-app events. The handler allows you to define logic for two scenarios:

  • Um evento in-app é gravado com sucesso
  • Ocorreu um erro ao gravar o evento in-app
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)
            }
        })

Se um erro ocorrer ao gravar o evento in-app, um código de erro e uma descrição de string são fornecidos, conforme indicado na tabela a seguir.

Código do erroDescrição (NSError)
10"Event timeout. Check 'minTimeBetweenSessions' param" ("Tempo limite do evento. Verifique parâmetro 'minTimeBetweenSessions'")
11"Skipping event because 'isStopTracking' enabled" ("Ignorando evento porque 'IsStopTracking' está ativado")
40Network error: Error description comes from Android (Erro de rede: descrição do erro vem do Android)
41"No dev key" ("Sem chave do desenvolvedor")
50"Falha no código de status" + código de resposta real do servidor

Recording offline events

O SDK pode registrar eventos que ocorrem quando nenhuma conexão com a internet está disponível. Consulte Eventos in-app offline para obter detalhes.

Logging events before calling start

If you initialized the SDK but didn't call start, the SDK will cache in-app events until start is invoked.

Se houver vários eventos no cache, eles serão enviados para o servidor um após o outro (sem lote, uma solicitação de rede por evento).

Registro de receita

You can send revenue with any in-app event. Use the AFInAppEventParameterName.REVENUE event parameter to include revenue in the in-app event. You can populate it with any numeric value, positive or negative.

O valor da receita não deve conter separadores de vírgula, símbolo de moeda ou texto. Um evento de receita deve ser semelhante a 1234,56, por exemplo.

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)

O evento de compra acima tem $200 em receita, aparecendo como receita no painel.

📘

Observação

Não adicione símbolos de moeda ao valor da receita.

Configuring revenue currency

You can set the currency code for an event's revenue by using the af_currency predefined event parameter:

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)
  • O código da moeda deve ser um código ISO 4217 de 3 caracteres
  • A moeda padrão é USD

Para saber mais sobre configurações de moeda, exibição e conversão de moeda, consulte nosso guia sobre moeda de receita.

Logging negative revenue

Pode haver situações em que você deseja registrar receita negativa. Por exemplo, um usuário recebe um reembolso ou cancela uma assinatura.

Para registrar a receita negativa:

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)

📘

Observação

Observe o seguinte no código acima:

  • O valor da receita é precedido por um sinal de menos
  • O nome do evento é um nome de evento personalizado chamado "cancel_purchase" - ele ajuda você a identificar facilmente eventos de receita negativa no painel e relatórios de dados brutos

Validando compras

AppsFlyer provides server verification for in-app purchases. The validateAndLogInAppPurchase method takes care of validating and logging the purchase event.

The validateAndLogInAppPurchase method

validateAndLogInAppPurchase is exposed via AppsFlyerLib.

validateAndLognInAppPurchase pega esses argumentos:

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: Contexto do aplicativo/atividade
  • publicKey: Chave de licença obtida do Google Play Console
  • signature: data.INAPP_DATA_SIGNATURE from onActivityResult
  • purchaseData: data.INAPP_PURCHASE_DATA from onActivityResult
  • price: Preço de compra, deve ser derivado de skuDetails.getStringArrayList("DETAILS_LIST")
  • currency: Moeda de compra, deve ser derivada de skuDetails.getStringArrayList("DETAILS_LIST")
  • additionalParameters - Parâmetros de eventos adicionais para registrar

If the validation is successful, an af_purchase event is logged with the values provided to validateAndLogInAppPurchase.

📘

Observação

validateAndLogInAppPurchase generates an af_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

use AppsFlyerInAppPurchaseValidatorListener to subscribe to purchase validation successes/failures and registerValidatorListener to register it in your Application class.

registerValidatorListener is exposed via AppsFlyerLib. To use AppsFlyerInAppPurchaseValidatorListener, import it:

import com.appsflyer.AppsFlyerInAppPurchaseValidatorListener;
import com.appsflyer.AppsFlyerInAppPurchaseValidatorListener

AppsFlyerInAppPurchaseValidatorListener tem dois callbacks:

registerValidatorListener pega 2 argumentos:

  • context: O contexto do aplicativo
  • validationListener: The AppsFlyerInAppPurchaseValidatorListener object you wish to register
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")
   }
})

A validação da compra in-app envia automaticamente um evento de compra in-app à AppsFlyer. Veja abaixo um exemplo de dados que são passados no parâmetro 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
}

Constantes de eventos

Predefined event names

Para usar as seguintes constantes, importe com.appsflyer.AFInAppEventType:

import com.appsflyer.AFInAppEventType;
import com.appsflyer.AFInAppEventType

Predefined event name constants follow a AFInAppEventType.EVENT_NAME naming convention. For example, AFInAppEventType.ADD_TO_CART

Nome do eventoNome constante do 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"
"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"
AFInAppEventType.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

To use the following constants, import AFInAppEventParameterName:

import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventParameterName

Predefined event parameter constants follow a AFInAppEventParameterName.PARAMETER_NAME naming convention. For example, AFInAppEventParameterName.CURRENCY

Nome do parâmetro do eventoNome constante do AndroidTipo
"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"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, tuple int formatado como (min,max)
"af_preferred_star_ratings"
PREFERRED_STAR_RATINGS
String, tuple int formatado como (min,max)