Sự kiện trong Ứng dụng

Tổng quan

Để biết thông tin giới thiệu về các sự kiện trong ứng dụng dành cho nhà phát triển, hãy xem phần Sự kiện trong ứng dụng.

Trước khi bạn bắt đầu

Bạn phải tích hợp SDK.

Ghi nhật ký sự kiện trong ứng dụng

SDK cho phép bạn ghi nhật ký các hành động của người dùng xảy ra trong ngữ cảnh ứng dụng của bạn. Chúng thường được gọi là sự kiện trong ứng dụng.

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 có 4 đối số:

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

Ví dụ: để ghi lại rằng một người dùng đã thêm một mục vào danh sách yêu thích của họ:

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

Dựa trên định nghĩa ví dụ được cung cấp trong Tìm hiểu định nghĩa cấu trúc sự kiện, sự kiện phải được triển khai như sau:

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:

  • Đã ghi nhận thành công sự kiện trong ứng dụng
  • Đã xảy ra lỗi khi ghi nhận sự kiện trong ứng dụng
AppsFlyerLib.getInstance().logEvent(getApplicationContext(),
                                    AFInAppEventType.PURCHASE,
                                    eventValues,
                                    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,
                                    eventValues,
                                    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)
            }
        })

Trong trường hợp xảy ra lỗi khi ghi sự kiện trong ứng dụng, mã lỗi và mô tả chuỗi sẽ được cung cấp, như được chỉ ra trong bảng sau.

Mã lỗiMô tả (NSError)
10"Event timeout. Check 'minTimeBetweenSessions' param" (Hết thời gian chờ của sự kiện. Kiểm tra thông số 'minTimeBetweenSessions')
11"Skipping event because 'isStopTracking' enabled" (Bỏ qua sự kiện vì 'isStopTracking' đã được bật)
40Network error: Error description comes from Android (Lỗi mạng: Mô tả lỗi đến từ Android)
41"No dev key" (Không có dev key)
50"Status code failure" (Lỗi mã trạng thái) + mã phản hồi thực tế từ máy chủ

Recording offline events

SDK có thể ghi lại các sự kiện xảy ra khi không có kết nối internet. Xem phần Sự kiện trong ứng dụng ngoại tuyến để biết chi tiết.

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.

Nếu có nhiều sự kiện trong bộ nhớ tạm, chúng sẽ lần lượt được gửi đến máy chủ (không phải hàng loạt, một yêu cầu mạng cho mỗi sự kiện).

Ghi nhật ký doanh thu

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.

Giá trị doanh thu không được chứa dấu tách dấu phẩy, ký hiệu tiền tệ hoặc văn bản. Ví dụ một sự kiện doanh thu nên tương tự như 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)

Sự kiện mua ở trên có doanh thu $200, hiển thị dưới dạng doanh thu trong bảng điều khiển.

📘

Lưu ý

Không thêm ký hiệu loại tiền tệ vào giá trị doanh thu.

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)
  • Mã tiền tệ phải là mã ISO 4217 gồm 3 ký tự
  • Loại tiền tệ mặc định là USD

Để tìm hiểu về cài đặt tiền tệ, hiển thị và chuyển đổi tiền tệ, hãy xem hướng dẫn về tiền tệ doanh thu của chúng tôi.

Logging negative revenue

Có thể có những tình huống mà bạn muốn ghi nhận doanh thu âm. Ví dụ: người dùng nhận được tiền hoàn lại hoặc hủy đăng ký.

Để ghi nhật ký doanh thu âm:

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)

📘

Lưu ý

Lưu ý những điều sau về mã code ở trên:

  • Giá trị doanh thu được bắt đầu bằng dấu trừ
  • Tên sự kiện là tên sự kiện tùy chỉnh gọi là "cancel_purchase" - tên này giúp bạn dễ dàng xác định các sự kiện doanh thu âm trong bảng điều khiển và báo cáo dữ liệu thô

Xác thực giao dịch mua

AppsFlyer provides server verification for in-app purchases. For more information see Validate and log purchase

Hằng số sự kiện

Predefined event names

Để sử dụng các hằng số sau, hãy nhập 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

Tên của sự kiệnTên hằng số 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

Tên thông số sự kiệnTên hằng số AndroidLoại
"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
String
"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
float
"af_projected_revenue"
PROJECTED_REVENUE
float
"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, int tuple có định dạng là (min,max)
"af_preferred_star_ratings"
PREFERRED_STAR_RATINGS
String, int tuple có định dạng là (min,max)