- SDK Version: 6.1.1 (Release Notes)
- Các phiên bản SDK không còn được hỗ trợ
Quan trọng!
SDK Android V6 có những thay đổi lớn so với các phiên bản trước đó đối với chức năng SDK và các API, bao gồm cả việc ngừng hỗ trợ và thay đổi tên phương thức. Tìm hiểu thêm về chuyển từ SDK V5.x.
1. Tổng quan
SDK Android của AppsFlyer cung cấp chức năng cài đặt ứng dụng và ghi nhận sự kiện cho các ứng dụng Android. SDK có thể được sử dụng với Java/Kotlin.
Nhúng SDK vào ứng dụng của bạn để ghi nhận:
- Lượt cài đặt ứng dụng
- Tương tác của người dùng (ví dụ: phiên và sự kiện trong ứng dụng)
1.1 Tích hợp SDK—những việc cần thực hiện
Tab | Mục đích | Sau khi hoàn thành |
---|---|---|
Tích hợp SDK ( Bắt buộc ) |
Thêm và cấu hình SDK |
|
API lõi (Khuyến nghị) |
Đo lường các sự kiện trong ứng dụng và doanh thu, Bật liên kết sâu và thu thập dữ liệu chuyển đổi |
|
Các API bổ sung |
Triển khai và sử dụng các API tùy chọn. Ví dụ: Đo lường lượt gỡ cài đặt và phân bổ lượt giới thiệu. |
|
Tài liệu tham chiếu API SDK |
1.2 Khả năng tương thích SDK với nền tảng Android
- Khởi động Android V4.0
- Các nền tảng dựa trên Android dành cho các thiết bị không di động như Smart TV, bao gồm cả Fire TV của Amazon
- Thị trường ngoài cửa hàng dành cho các ứng dụng Android, như Amazon và Baidu
Các phần sau đây mô tả cách triển khai và khởi chạy SDK AppsFlyer. Sau khi hoàn thành phần này, bạn sẽ thấy hai lượt cài đặt trong bảng điều khiển AppsFlyer của mình: tự nhiên và không tự nhiên.
2. Thêm SDK vào ứng dụng của bạn
2.1 Thêm SDK vào dự án của bạn
Sử dụng một trong các phương thức sau để thêm SDK vào ứng dụng của bạn:
- [Phương thức tốt nhất] Sử dụng Gradle
- Thêm SDK theo cách thủ công
- Thêm mã dưới đây vào Cấp độ Mô-đun /app/build.gradle trước
các phần phụ thuộc
:repositories { mavenCentral() }
- Thêm phiên bản mới nhất của AppsFlyer SDK làm một phần phụ thuộc. Bạn có thể tìm thấy phiên bản mới nhất tại đây .
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' }
- Đồng bộ hóa dự án để truy xuất các phần phụ thuộc - xem ảnh chụp màn hình sau:
2.2 Thêm người giới thiệu cài đặt Android vào ứng dụng của bạn
Liên kết giới thiệu cài đặt Android cải thiện độ chính xác phân bổ, bảo vệ khỏi gian lận cài đặt và hơn thế nữa. Liên kết này được hỗ trợ từ Android SDK của AppsFlyer phiên bản 4.8.6.
Lưu ý
Google deprecated the BroadcastReceiver in March 2020.
- Thay đổi này không ảnh hưởng đến ứng dụng.
- Bạn vẫn có thể cần BroadcastReceiver để thực hiện phân bổ ngoài cửa hàng. Để chắc chắn, hãy kiểm tra với cửa hàng nơi đăng ứng dụng đó.
- Việc triển khai người giới thiệu cài đặt hiện là bắt buộc.
Có hai cách để thêm người giới thiệu cài đặt vào ứng dụng của bạn:
- Sử dụng Gradle (khuyến nghị)
- Thêm người giới thiệu cài đặt theo cách thủ công
Thêm Liên kết giới thiệu cài đặt Android làm phần phụ thuộc. Bạn có thể tìm thấy phiên bản mới nhất tại đây.
-
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' }
- Đồng bộ hóa dự án để truy xuất các phần phụ thuộc - xem ảnh chụp màn hình sau:
Nếu bạn đang sử dụng ProGuard và muốn sử dụng API của người giới thiệu mới của Google, hãy đặt quy tắc ProGuard sau: -keep public class com.android.installreferrer.** { *; }
- Tải xuống Install Referrer aar
- Thêm vào dự án
- Thêm quyền sau đây vào tập tin kê khai:
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
2.3 Thiết lập các quyền truy cập bắt buộc
Thêm quyền truy cập giúp tăng tỷ lệ Phân bổ mô hình xác suất. Nó cũng cho phép SDK gửi thêm dữ liệu như Wifi và dữ liệu mạng của nhà mạng. Bạn có thể tìm thấy dữ liệu này trong báo cáo dữ liệu thô và sử dụng nó để phân tích và tối ưu hóa các chiến dịch.
Thêm quyền truy cập bắt buộc
- Thêm các quyền truy cập sau vào
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" /> <!-- Optional : --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.4 Thiết lập BroadcastReceiver để lấy dữ liệu từ Google Play
Lưu ý
Google deprecated the BroadcastReceiver in March 2020.
- Thay đổi này không ảnh hưởng đến ứng dụng.
- Bạn vẫn có thể cần BroadcastReceiver để thực hiện phân bổ ngoài cửa hàng. Để chắc chắn, hãy kiểm tra với cửa hàng nơi đăng ứng dụng đó.
- Việc triển khai người giới thiệu cài đặt hiện là bắt buộc.
BroadcastReceiver lấy thông tin từ Google Play AppsFlyer sử dụng để phân bổ. Sử dụng BroadcastReceiver làm tăng tỷ lệ phân bổ.
Hai lựa chọn sau đây khả dụng cho việc thực hiện bộ phận thu nhận truyền phát tham chiếu cài đặt (Broadcast Receiver):
Nếu bạn không có thành phần thu nhận nghe trên INSTALL_REFERRER
, trong AndroidManifest.xml
, trong thẻ application
(ứng dụng), hãy thêm thành phần thu nhận sau:
<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>
Mách nhỏ
Nếu bạn gặp lỗi "Chưa giải quyết lớp SingleInstallBroadcastReceiver" sau khi thêm bộ thu vào AndroidManifest.xml, hãy đảm bảo xây dựng ứng dụng trước.
3. Triển khai và khởi tạo SDK
Phần này mô tả cách triển khai và khởi chạy SDK.
3.1 Lấy khóa dev của bạn
AppsFlyer sử dụng khóa dev để xác định duy nhất tài khoản của bạn. Khóa dev là bắt buộc vì khóa cho phép SDK gửi và truy xuất dữ liệu một cách an toàn thuộc tài khoản AppsFlyer của bạn.
Cảnh báo! Việc sử dụng sai dev key hoặc dev key không chính xác sẽ ảnh hưởng đến tất cả lưu lượng truy cập được gửi từ SDK và gây sự cố phân bổ và báo cáo.
Để lấy khóa dev của bạn:
- Đi tới bảng điều khiển ứng dụng của bạn
- Trong bảng điều khiển, trong phần Configuration (Cấu hình), nhấp vào App Settings (Cài đặt Ứng dụng).
- Sao chép khóa dev của bạn.
3.2 Khởi tạo SDK
Chúng tôi khuyên bạn nên khởi tạo SDK bên trong lớp ứng dụng toàn cầu của ứng dụng. Điều này cho phép SDK khởi tạo trong tất cả các tình huống, bao gồm cả liên kết sâu.
Các bước được liệt kê dưới đây diễn ra bên trong lớp ứng dụng toàn cầu của ứng dụng.
- Trong lớp toàn cầu của ứng dụng, nhập các thư viện sau
import android.app.Application; import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; import java.util.Map;
- Trong lớp chung, hãy gán khóa dev của bạn cho một biến, tốt nhất là AF_DEV_KEY.
Quan trọng: quan trọng là phải sử dụng khóa dev chính xác khi khởi tạo SDK. Sử dụng sai khóa dev hoặc khóa dev không chính xác sẽ ảnh hưởng đến tất cả lưu lượng truy cập được gửi từ SDK và gây ra sự cố phân bổ và báo cáo.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; //... }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; //... }
- Bên trong lớp toàn cầu, sau lệnh gọi
super.onCreate ()
, triển khaiAppsFlyerConversionListener
. Xem mã dưới đây trong bước 4. - Bên trong lớp chung, sau
ConversionListener
, hãy khởi tạo SDK bằng phương thứcinit()
.
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) } }
- Bên trong lớp toàn cục của ứng dụng, hãy gọi lệnh
start()
.
AppsFlyerLib.getInstance().start(this);
AppsFlyerLib.getInstance().start(this)
3.3 Đăng ký lớp ứng dụng toàn cầu
Trong tệp tin AndroidManifest.xml
, bên trong thẻ application
(ứng dụng), hãy thêm dòng sau:
android:name="APP.PACKAGE.NAME.AFApplication"
- APP.PACKAGE.NAME - thay thế bằng tên gói của ứng dụng.
- AFApplication - thay thế bằng tên mà bạn đặt cho lớp chung của ứng dụng.
Dòng này trong tệp manifest.xml cho ứng dụng biết ứng dụng toàn cầu là gì. Như đã đề cập ở trên, thao tác như vậy giúp cho SDK AppsFlyer có thể được truy cập toàn cầu trong toàn bộ ứng dụng.
3.4 Trì hoãn khởi tạo SDK
Để trì hoãn việc khởi tạo SDK, bạn có thể gọi start từ lớp Hoạt động.
Bạn có thể sử dụng tùy chọn này, ví dụ như nếu bạn cần trì hoãn start cho đến khi nhận được sự đồng ý của người dùng do các yêu cầu GDPR hoặc CCPA, v.v.
Khi gọi start trong lớp Hoạt động:
- Đảm bảo duyệt phiên bản Hoạt động làm đối số chứ không phải Ứng dụng.
- Nếu bạn định sử dụng các tính năng liên kết sâu, hãy thêm API
start()
vào bất kỳ Hoạt động nào khác mà bạn có thể liên kết sâu đến mà không có start ở trong đó.
4. Kiểm tra lượt cài đặt
Bạn đã sẵn sàng thử nghiệm tích hợp SDK bằng cách mô phỏng lượt cài đặt không tự nhiên và tự nhiên.
4.1 Đăng ký thiết bị thử nghiệm của bạn
Trước khi bắt đầu thử nghiệm lượt cài đặt, hãy đăng ký thiết bị thử nghiệm.
4.2 Mô phỏng cài đặt tự nhiên
Các lượt cài đặt tự nhiên là cài đặt không phân bổ, thường cài đặt trực tiếp từ các cửa hàng ứng dụng.
Để mô phỏng cài đặt tự nhiên:
- Đảm bảo bạn có thiết bị di động được kết nối với máy tính của mình
- Trong Android Studio, mở Logcat.
- Từ Android Studio, cài đặt ứng dụng trên thiết bị hoặc trình giả lập.
- Đợi ứng dụng khởi chạy.
- Trong Logcat, hãy tìm tên gói ứng dụng của bạn.
Bạn nên xem những nội dung sau:
Phần được tô sáng trong ảnh chụp màn hình chỉ ra rằng SDK báo cáo một cài đặt tự nhiên. Dữ liệu này xuất phát từ phương thức onConversionDataSuccess
trong lớp AFApplication. Nhận dữ liệu chuyển đổi sẽ được thảo luận sau trong hướng dẫn này .
Lưu ý: Bắt đầu SDK V5, onConversionDataSuccess
là tên của phương thức để nhận dữ liệu chuyển đổi. Nếu bạn đang sử dụng phiên bản SDK thấp hơn 5.0.0, tên của phương thức này là onInstallConversionDataLoaded
. Chúng tôi khuyên bạn nên nâng cấp lên SDK 5.0.0. Để tìm hiểu thêm, hãy nhấp tại đây .
Cài đặt tự nhiên sẽ xuất hiện trên trang Tổng quan của bảng điều khiển của ứng dụng ngây bây giờ .
Nếu bạn không thấy cài đặt trong bảng điều khiển của ứng dụng, hãy xem hướng dẫn khắc phục sự cố SDK của chúng tôi.
4.3 Mô phỏng cài đặt không tự nhiên
Cài đặt không tự nhiên là lượt cài đặt được phân bổ thường theo sau quảng cáo. Bạn có thể mô phỏng cài đặt không tự nhiên bằng cách sử dụng các liên kết phân bổ.
Để mô phỏng cài đặt không tự nhiên:
- Trong bảng kê khai, hãy tìm hiểu tên gói của ứng dụng của bạn là gì, ví dụ: com.company.app.
- Trong URL bên dưới, thay thế <app_id> bằng tên gói ứng dụng của bạn:
https://app.appsflyer.com/<app_id>?pid=Test&c=Test
- Thông số c chỉ định tên của chiến dịch.
- Thông số pid chỉ định tên của nguồn truyền thông mà lượt cài đặt được phân bổ.
- ID quảng cáo (GAID) phải được thêm vào nếu thử nghiệm lượt nhấp từ máy tính (bằng cách thêm
&advertising_id=<GAID>
vào cuối liên kết ở bước 1).
- Trong URL bên dưới, thay thế <app_id> bằng tên gói ứng dụng của bạn:
- Gửi URL này đến thiết bị. Bạn có thể gửi qua email hoặc WhatsApp.
- Trên thiết bị, nhấp vào URL.
- Nếu ứng dụng được liệt kê trong cửa hàng ứng dụng, bạn sẽ được chuyển hướng đến cửa hàng ứng dụng. Vui lòng không tải xuống và cài đặt ứng dụng từ cửa hàng ứng dụng. Tiếp tục với bước 5.
- Nếu ứng dụng không được liệt kê trong cửa hàng ứng dụng và vẫn đang được phát triển, màn hình sẽ hiển thị thông báo rằng ứng dụng không có sẵn trong cửa hàng ứng dụng. Bạn chỉ cần tiếp tục với bước 5.
- Trong Android Studio, mở Logcat.
- Kết nối thiết bị với máy tính của bạn bằng cáp USB.
- Từ Android Studio, Cài đặt ứng dụng trên thiết bị.
- Trong Logcat, hãy tìm tên gói ứng dụng của bạn.
Bạn nên xem những nội dung sau:
Cài đặt không tự nhiên sẽ xuất hiện trên trang Tổng quan của bảng điều khiển của ứng dụng ngay bây giờ .
Lưu ý
Khi bạn hoàn tất thử nghiệm và gỡ lỗi tích hợp SDK, hãy tắt nhật ký SDK.
Các sự cố tích hợp SDK đã biết
Xem phần sau để tìm hiểu thêm về các sự cố có thể xảy ra khi tích hợp SDK và cách khắc phục.
Cảnh báo ProGuard
Nếu bạn đang sử dụng ProGuard và bạn gặp phải một cảnh báo liên quan đến lớp AFKeystoreWrapper
của chúng tôi, thì hãy thêm mã sau vào tệp quy tắc ProGuard của bạn:
-keep class com.appsflyer.** { *; }
Quy tắc sao lưu
Nếu bạn thêm android:fullBackupContent="true"
bên trong thẻ <application> trong AndroidManifest.xml, bạn có thể nhận được lỗi:
Gộp tập tin kê khai không thành công: Phân bổ giá trị application@fullBackupContent=(true)
Để khắc phục lỗi này, hãy thêm công cụ:thay thế="android: fullBackupContent"
trong thẻ <application> trong tập tin AndroidManifest.xml.
Nếu bạn đã chỉ định quy tắc sao lưu của riêng mình (android:fullBackupContent="@xml/my_rules"
), ngoài các hướng dẫn ở trên, vui lòng hợp nhất chúng với quy tắc AppsFlyer theo cách thủ công bằng cách thêm quy tắc sau:
<full-backup-content>
...//quy tắc tùy chỉnh của bạn
<exclude domain="sharedpref" path="appsflyer-data"/>
</full-backup-content>
Thiếu tệp tin nguồn
Nếu bạn đang sử dụng SDK Android V5 trở lên, hãy đảm bảo rằng trong tệp tin APK, ngoài classes.dex và tệp tin nguồn, bạn còn có thư mục com > appsflyer > internal với các tệp tin a- và b- bên trong.
Lưu ý: Trước SDK 5.3.0, các tệp tin là a. và b.
Kiểm tra đảm bảo bạn có các tệp tin cần thiết bằng cách mở APK của bạn trong Android Studio. Xem ảnh chụp màn hình sau để tham khảo.
Nếu thiếu các tệp tin đó, SDK không thể thực hiện các yêu cầu mạng đến máy chủ của chúng tôi và bạn cần liên hệ với CSM hoặc bộ phận hỗ trợ của mình.
Tab này giải thích cách ghi nhận các sự kiện trong ứng dụng, doanh thu và cách thiết lập liên kết sâu.
Ghi nhận các sự kiện và doanh thu trong ứng dụng cho phép bạn đo lường chất lượng của người dùng. Liên kết sâu cho phép bạn cung cấp cho người dùng trải nghiệm người dùng tốt hơn.
Tab này chứa các hướng dẫn cho nhà phát triển, nhưng thông tin đầu vào từ nhà tiếp thị là điều cần thiết bởi vì:
- Nhà tiếp thị sẽ quyết định những sự kiện trong ứng dụng nào cần ghi nhận để đo lường chất lượng người dùng.
- Nhà tiếp thị có quyền truy cập vào bảng điều khiển AppsFlyer, được yêu cầu cho việc thiết lập OneLink dành cho liên kết sâu.
5. Ghi nhận sự kiện trong ứng dụng
Các sự kiện trong ứng dụng cung cấp thông tin chi tiết về những gì đang xảy ra trong ứng dụng của bạn. Bạn nên dành thời gian và xác định các sự kiện bạn muốn ghi nhận. Ghi nhận sự kiện trong ứng dụng cho phép bạn đo lường các KPI như ROI (Lợi tức đầu tư) và LTV (Giá trị vòng đời khách hàng).
Có một số cách để ghi nhận các sự kiện trong ứng dụng. Cách phổ biến nhất là gửi các sự kiện thông qua SDK. Chúng ta sẽ thảo luận về cách thức này trong bài viết này. Để tìm hiểu về những cách thức ghi nhận các sự kiện trong ứng dụng khác, vui lòng xem hướng dẫn tổng quan về sự kiện trong ứng dụng .
Nếu ứng dụng của bạn thuộc một cấu trúc dọc nào đó, ví dụ: du lịch, chơi game, thương mại điện tử, v.v., bạn có thể sử dụng danh sách đầy đủ các sự kiện trong ứng dụng được đề xuất cho mỗi cấu trúc dọc.
5.1 Tên và tham số sự kiện trong ứng dụng
SDK có hai giao diện liên quan đến sự kiện trong ứng dụng:
- AFInAppEventType - hằng số cho tên sự kiện trong ứng dụng
- AFInAppEventParameterName - hằng số cho tên thông số sự kiện trong ứng dụng
Chúng tôi đặc biệt khuyên bạn nên sử dụng hai giao diện này vì những lý do sau:
- Việc đặt tên theo tiêu chuẩn cho phép AppsFlyer tự động ánh xạ các sự kiện tới các SRN như Facebook, Google, Twitter và Snapchat.
- Khả năng tương thích ngược - nếu AppsFlyer quyết định thay đổi tên của bất kỳ tham số sự kiện hoặc sự kiện nào, thì việc triển khai của bạn là tương thích ngược.
Để sử dụng hai giao diện này, vui lòng nhập chúng:
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventType;
Dưới đây là danh sách các tên và cấu trúc sự kiện được đề xuất .
5.2 Ghi nhận doanh thu
Bạn có thể gửi doanh thu với bất kỳ sự kiện trong ứng dụng. Sử dụng thông số sự kiện af_revenue
(AFInAppEventParameterName.REVENUE
) để bao gồm doanh thu trong sự kiện trong ứng dụng. Bạn có thể điền giá trị số bất kỳ, âm hoặc dương.
af_revenue
là tham số sự kiện duy nhất được đếm trên AppsFlyer như doanh thu thực trên dữ liệu thô và bảng điều khiển. Để biết thêm thông tin chi tiết, vui lòng nhấp vào đây.
Khi gửi sự kiện có doanh thu, hãy ghi nhớ những điều sau:
- Nếu bạn thiết lập mã tiền tệ (xem ví dụ bên dưới), mã đó phải là mã ISO 4217 có 3 ký tự. (mặc định là USD).
- Bạn có thể thiết lập mã tiền tệ cho tất cả các sự kiện bằng cách gọi phương thức sau:
AppsFlyer.setCurrencyCode ( "ZZZ" )
. Để 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. - 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.
Ví dụ: Sự kiện mua sự kiện trong ứng dụng có doanh thu
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)
Sự kiện mua hàng trên có doanh thu $1234.56 được liên kết với nó, xuất hiện dưới dạng doanh thu trong bảng điều khiển.
Ghi nhận doanh thu âm
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 cho đôi giày họ đã mua từ bạn.
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)
Lưu ý
Lưu ý những điều sau trong mã ở trên:
- Giá trị doanh thu được bắt đầu bằng dấu trừ
- Tên sự kiện có giá trị duy nhất "cancel_purchase" - để cho phép bạn xác định các sự kiện doanh thu âm trong dashboard và báo cáo dữ liệu thô
5.3 Xác nhận mua trong ứng dụng
SDK của AppsFlyer cung cấp xác thực biên lai máy chủ cho các giao dịch mua trong ứng dụng. Để xác thực việc mua hàng, hãy gọi validateAndLogInAppPurchase
.
Cuộc gọi này sẽ tự động tạo ra một sự kiện trong ứng dụng af_purchase
, với điều kiện là giao dịch mua được xác nhận.
public static void validateAndLogInAppPurchase(Context context,
String publicKey, String signature, String purchaseData,
String price, String currency, HashMap<String, String> additionalParameters);
Các tham số phương thức
- Chuỗi publicKey – khóa chung từ Giao diện điều khiển dành cho Nhà phát triển của Google
- Chữ ký chuỗi – chữ ký giao dịch (được trả về từ API Google khi hoàn tất giao dịch mua)
- Chuỗi purchaseData – sản phẩm được mua ở định dạng JSON (được trả về từ API Google khi hoàn tất giao dịch mua)
- Chuỗi giá – doanh thu sự kiện trong ứng dụng sẽ được báo cáo cho AppsFlyer.
- Chuỗi tiền tệ – tiền tệ sự kiện trong ứng dụng sẽ được báo cáo cho AppsFlyer
- HashMap<String, String> additionalParameters – tham số bổ sung của sự kiện trong ứng dụng xuất hiện trong trường event_value trong dữ liệu thô của sự kiện trong ứng dụng.
Xác thực mua thành công và gọi lại thất bại
Nếu bạn muốn biết liệu nỗ lực xác thực mua hàng có thành công hay không, hãy triển khai registerValidatorListener trong lớp ứng dụng của bạn. Trình nghe này có hai khối gọi lại, một khối dành cho 'Thành công' và một khối dành cho 'Thất bại' (vì bất kỳ lý do nào, bao gồm cả xác nhận thất bại).
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")
}
})
Ví dụ sử dụng để xác nhận mua hàng:
// 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);
}
Xác thực mua hàng trong ứng dụng sẽ tự động gửi một sự kiện mua trong ứng dụng tới AppsFlyer. Vui lòng xem bên dưới dữ liệu mẫu được truyền trong tham số 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
}
Lưu ý
Việc gọi validateAndTrackInAppPurchase
tự động tạo ra một sự kiện trong ứng dụng af_purchase. Tự gửi sự kiện này tạo ra báo cáo sự kiện trùng lặp gấp đôi.
5.4 Giới hạn sự kiện trong ứng dụng
- Tên sự kiện: tối đa 45 ký tự
- Giá trị sự kiện: không được vượt quá 1000 ký tự - nếu dài hơn chúng tôi có thể cắt bớt nó
- Định giá và doanh thu: chỉ sử dụng các chữ số và số thập phân, ví dụ 5 hoặc 5.2.
- Giá trị định giá và doanh thu có thể có tối đa 5 chữ số sau dấu chấm, ví dụ: 5.12345
- Có hỗ trợ các ký tự không phải tiếng Anh, trong các sự kiện trong ứng dụng, các SDK API khác, bắt đầu từ Android SDK V4.8.1.
5.5 Ví dụ về ghi nhận sự kiện trong ứng dụng
Bạn có thể ghi lại các sự kiện trong ứng dụng bằng cách gọi trackEvent
với các tham số giá trị và tên sự kiện. Xem tài liệu về Sự kiện trong ứng dụng để biết thêm chi tiết.
Dưới đây là một ví dụ đơn giản về cách ghi lại một sự kiện mua hàng. Để biết danh sách đầy đủ các đoạn mã được tạo sẵn cho mỗi cấu trúc dọc, vui lòng xem hướng dẫn của chúng tôi về sự kiện phong phú trong ứng dụng cho mỗi cấu trúc dọc.
Ví dụ: Sự kiện mua trong ứng dụng
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 Ghi nhận các sự kiện trong ứng dụng ngoại tuyến
Nếu người dùng bắt đầu một sự kiện khi không có kết nối internet, Appsflyer vẫn có thể ghi nhận nó. Đây là cách thức hoạt động:
- SDK gửi các sự kiện tới máy chủ của AppsFlyer và chờ đợi phản hồi.
- Nếu SDK không nhận được phản hồi mã 200, sự kiện được lưu trữ trong bộ nhớ cache.
- Khi nhận được phản hồi mã 200 tiếp theo, sự kiện được lưu trữ được gửi lại cho máy chủ.
- Nếu có nhiều sự kiện trong bộ nhớ cache, chúng được gửi đến máy chủ một cách lần lượt và nhanh chóng.
Lưu ý
Bộ nhớ cache của SDK có thể lưu trữ tối đa 40 sự kiện, có nghĩa là chỉ lưu được 40 sự kiện đầu tiên xảy ra ngoại tuyến. Tất cả mọi thứ xảy ra sau đó cho đến phản hồi mã 200 tiếp theo được loại bỏ.
Thời gian sự kiện xuất hiện trong dữ liệu thô là thời gian mà sự kiện được gửi tới AppsFlyer sau khi thiết bị được kết nối internet trở lại. Đây không phải là thời gian thực tế mà sự kiện diễn ra.
5.7 xử lý thành công và sự cố khi ghi nhận các sự kiện trong ứng dụng
Bạn có thể đặt trình nghe khi ghi nhận sự kiện trong ứng dụng. Trình nghe cho phép bạn xác định logic cho hai tình huống:
- Đã ghi nhận thành công sự kiện trong ứng dụng.
- Có lỗi xảy ra khi ghi nhận sự kiện trong ứng dụng.
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)
}
})
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ỗi | Mô tả chuỗi |
---|---|
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 'isStopped' enabled" (Bỏ qua sự kiện vì 'isStopped' đã được bật) |
40 |
Network 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" + actual response code from the server ("Lỗi mã trạng thái" + mã phản hồi thực tế từ máy chủ) |
6. Liên kết sâu với OneLink
OneLink là giải pháp của AppsFlyer dành cho phân bổ đa nền tảng, chuyển hướng và liên kết sâu .
6.1 Phát hiện và chuyển hướng thiết bị
OneLink có thể phát hiện loại thiết bị khi nhấp và chuyển hướng người dùng tới đích phù hợp, ví dụ: Google Play, cửa hàng ứng dụng iOS, thị trường ngoài cửa hàng hoặc các trang web.
Hướng dẫn Chuyển hướng OneLink thảo luận về việc triển khai các liên kết phân bổ đa nền tảng (không yêu cầu mã hóa SDK). Đây cũng là cơ sở cho các liên kết sâu.
6.2 Liên kết sâu
Liên kết sâu cho phép bạn gửi người dùng đến các hoạt động cụ thể và phục vụ họ với nội dung tùy chỉnh. Điều này đặc biệt hữu ích khi chạy các chiến dịch nhắm mục tiêu lại.
Để thiết lập liên kết sâu với OneLink, nhà tiếp thị có quyền truy cập vào bảng điều khiển AppsFlyer và nhà phát triển có quyền truy cập vào ứng dụng phải hoạt động cùng nhau.
Xem hướng dẫn của chúng tôi về thiết lập liên kết sâu với OneLink.
6.3 Liên kết sâu bị trì hoãn
Liên kết sâu bị trì hoãn cho phép bạn liên kết sâu người dùng mới và phục vụ họ với nội dung tùy chỉnh sau khi họ cài đặt ứng dụng. Liên kết sâu này không giống như liên kết sâu thông thường nơi ứng dụng cần được cài đặt trên thiết bị của người dùng.
Để thiết lập liên kết sâu bị trì hoãn với OneLink, nhà phát triển cũng cần truy cập vào bảng điều khiển AppsFlyer.
Thiết lập cho liên kết sâu bị trì hoãn cũng giống như thiết lập dành cho liên kết sâu. Sự khác biệt duy nhất là bạn cần triển khai logic bổ sung trong ứng dụng để liên kết sâu với người dùng và phục vụ họ với nội dung tùy chỉnh sau khi họ cài đặt và khởi chạy ứng dụng.
Xem hướng dẫn của chúng tôi về liên kết sâu bị trì hoãn để tìm hiểu thêm.
6.4 Nhận dữ liệu liên kết sâu
SDK cung cấp cho bạn dữ liệu chuyển đổi hoặc tương tác sau mỗi lần cài đặt hoặc sự kiện liên kết sâu. Bạn có thể sử dụng dữ liệu này để tùy chỉnh nội dung và hành vi của ứng dụng theo chương trình.
Để có được dữ liệu liên kết sâu khi sử dụng liên kết sâu trực tiếp và đang mở ứng dụng, hãy thực hiện phương thức onAppOpenAttribution.
Để có được dữ liệu tái tương tác liên kết sâu theo cách thủ công bất cứ lúc nào, hãy thực hiện phương thức performOnAppAttribution.Điều này cho phép truy cập vào dữ liệu tái tương tác mà không ghi nhận lượt tái tương tác mới.
Xem hướng dẫn của chúng tôi về dữ liệu liên kết sâu để tìm hiểu thêm.
7. Lấy dữ liệu chuyển đổi
Bạn có thể truy cập dữ liệu phân bổ người dùng trong thời gian thực đối với mỗi lượt cài đặt mới, bên trong SDK.
Bằng cách này, bạn có thể mang đến cho người dùng nội dung được cá nhân hóa hoặc gửi cho họ các hoạt động cụ thể trong ứng dụng (xem liên kết sâu bị trì hoãn trong bài viết này). Điều này giúp tăng cường sự thu hút của người dùng với ứng dụng.
Để có được dữ liệu chuyển đổi của AppsFlyer từ SDK Android, hãy triển khai 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)
}
}
Các API quan trọng nhất trong giao diện AppsFlyerConversionListener
là:
-
onInstallConversionData
- cung cấp dữ liệu chuyển đổi cho các lượt cài đặt mới.
Lưu ý: Bắt đầu từ SDK V5,onConversionDataSuccess
là tên của phương thức để lấy dữ liệu chuyển đổi. Nếu bạn đang sử dụng phiên bản SDK thấp hơn 5.0.0, tên của phương thức này làonInstallConversionDataLoaded
. Bạn nên nâng cấp lên SDK 5.0.0. Để tìm hiểu thêm, hãy nhấp vào đây. -
onAppOpenAttribution
- cung cấp dữ liệu chuyển đổi nhắm mục tiêu lại khi một ứng dụng hiện có được khởi chạy, thủ công hoặc thông qua liên kết sâu.
Để tìm hiểu thêm về dữ liệu chuyển đổi, hãy xem hướng dẫn của chúng tôi về các tình huống dữ liệu chuyển đổi.
8. Phân bổ
Các ứng dụng Android không có trong cửa hàng
Với AppsFlyer, bạn có thể phân bổ lượt cài đặt cho các ứng dụng Android không có trong cửa hàng. Điều này cho phép bạn quảng bá ứng dụng của mình và tiếp cận đối tượng lớn hơn ở các thị trường không có Google Play.
Để biết thêm chi tiết về cách phân bổ lượt cài đặt cho các ứng dụng không có trong cửa hàng, hãy đọc tại đây.
Ứng dụng được cài đặt sẵn
Trong các chiến dịch cài đặt sẵn, chủ sở hữu ứng dụng có thể yêu cầu các nhà sản xuất thiết bị cài đặt sẵn ứng dụng của họ trên thiết bị trước khi thiết bị rời khỏi nhà máy.
Với AppsFlyer, bạn có thể dễ dàng phân bổ lượt cài đặt các ứng dụng được cài đặt sẵn. Khi người dùng khởi chạy ứng dụng của bạn lần đầu tiên, AppsFlyer phân bổ lượt cài đặt cho nhà sản xuất dưới dạng nguồn truyền thông.
Để biết chi tiết, nhấp vào đây.
Đo lường lượt Gỡ cài đặt
Để tìm hiểu cách thiết lập đo lường lượt gỡ cài đặt, hãy đọc tại đây.
Cài đặt trình nghe yêu cầu
Nếu bạn muốn nhận xác nhận rằng yêu cầu đã được máy chủ AppsFlyer nhận thành công, hãy triển khai trình nghe AppsFlyerRequestListener.
Phương thức gọi lại onRequestSuccess()
được gọi cho mỗi 200 phản hồi
đối với yêu cầu phân bổ thực hiện bởi SDK.
Phương thức gọi lại onRequestFailure(String error)
được gọi cho bất kỳ phản hồi nào khác và trả về phản hồi như một chuỗi lỗi.
Ví dụ
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)
}
})
Trong trường hợp xảy ra lỗi trong trình theo dõi yêu cầu, mã lỗi và mô tả chuỗi sẽ được cung cấp, như được chỉ ra trong bảng sau.
Mã lỗi | Mô tả chuỗi |
---|---|
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 'isStopped' enabled" (Bỏ qua sự kiện vì 'isStopped' đã được bật) |
40 |
Network 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" + actual response code from the server ("Lỗi mã trạng thái" + mã phản hồi thực tế từ máy chủ) |
Thiết lập Dữ liệu Tùy chỉnh Bổ sung
Phải có API setAdditionalData
để tích hợp ở cấp SDK với một số nền tảng đối tác bên ngoài, bao gồm Segment, Adobe và Urban Airship.
Chỉsử dụng API này nếu bài viết tích hợp của nền tảng nêu rõ rằng bắt buộc phải có setAdditionalData API.
Ví dụ về mã setAdditableData:
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)
Phân bổ các phiên ứng dụng bắt nguồn từ các trang web sở hữu (miền)
Chủ sở hữu ứng dụng sử dụng Liên kết Ứng dụng để liên kết sâu (không có OneLink) và có miền được liên kết với ứng dụng của họ có thể phân bổ các phiên được khởi tạo thông qua miền này bằng phương thức appendParametersToDeepLinkingURL
.
Ví dụ: một người dùng tìm kiếm trên Google và nhấp vào miền của bạn, www.example.com:
- Nếu người dùng chưa cài đặt ứng dụng, họ sẽ được chuyển hướng đến trang web (www.example.com).
- Nếu người dùng đã cài đặt ứng dụng trên thiết bị của họ, họ sẽ được liên kết sâu vào ứng dụng được liên kết với www.example.com. Phiên này được phân bổ cho nguồn truyền thông (thông số
pid
) được chỉ định trongappendParametersToDeepLinkingURL
.
Xem tài liệu tham khảo về SDK Android để biết thêm thông tin.
Lưu ý: Biểu ngữ Thông minh giúp chủ sở hữu ứng dụng chuyển đổi khách truy cập trang web thành người dùng ứng dụng.
9. Các phiên
Tùy chỉnh thời gian giữa các phiên
Theo mặc định, phải mất ít nhất 5 giây giữa hai lần khởi chạy ứng dụng để được tính là hai phiên riêng biệt (tìm hiểu thêm về tính các phiên).
Sử dụng API sau để đặt thời gian tối thiểu giữa các phiên:
AppsFlyerLib.setMinTimeBetweenSessions(int giây);
Đặt một giá trị cao cho thời gian tùy chỉnh giữa các phiên khởi chạy có thể ảnh hưởng xấu tới API dựa trên dữ liệu các phiên, chẳng hạn như liên kết sâu.
Phiên chạy nền cho ứng dụng tiện ích
Bạn có thể báo cáo về các phiên người dùng mới bằng phương pháp SDK này. Ví dụ: phương pháp này có thể hữu ích cho các ứng dụng tiện ích chạy trong nền.
Sử dụng API này trong onCreate () của hoạt động của bạn:
public void logSession(Context context);
Ví dụ cách dùng:
AppsFlyerLib.getInstance().logSession(context);
10. Kênh truyền thông riêng
Giải quyết các URL Liên Kết Sâu Được Gói
Một số dịch vụ của bên thứ 3 như nhà cung cấp dịch vụ email gói liên kết trong email với tên miền ghi nhận click của riêng họ. Một số dịch vụ thậm chí cho phép bạn thiết lập các miền ghi nhận nhấp chuột của riêng bạn. Nếu OneLink được gói trong các miền như vậy, điều này có thể giới hạn chức năng của nó.
Để khắc phục vấn đề này, bạn có thể sử dụng API setResolveDeepLinkURLs. Sử dụng API này để nhận OneLink từ các miền nhấp chuột khởi chạy ứng dụng. Đảm bảo gọi API này trước khi khởi tạo SDK.
Ví dụ: bạn có ba miền nhấp chuột chuyển hướng đến OneLink của bạn, đó là https://mysubdomain.onelink.me/abCD. Sử dụng API này để nhận OneLink mà miền nhấp chuột của bạn chuyển hướng đến. Phương thức API này nhận được danh sách các miền mà SDK giải quyết. Thêm mã sau đây trước khi khởi tạo SDK.
AppsFlyerLib.getInstance().setResolveDeepLinkURLs("clickdomain.com", "myclickdomain.com", "anotherclickdomain.com");
Mã ở trên cho phép bạn sử dụng miền nhấp chuột của mình trong khi vẫn duy trì chức năng OneLink. Các miền nhấp chuột có trách nhiệm khởi chạy ứng dụng. API, khi đến lượt, nhận được OneLink từ những miền nhấp chuột và sau đó bạn có thể sử dụng dữ liệu từ OneLink này để liên kết sâu và tùy chỉnh nội dung người dùng.
Ghi nhận thông báo đẩy
Với AppsFlyer, bạn có thể ghi nhận thông báo đẩy như một phần của chiến dịch nhắm mục tiêu lại.
Để bật tính năng này, hãy gọi phương thức sendPushNotificationData
bên trong phương thức onCreate
của mọi hoạt động được khởi chạy sau khi nhấp vào thông báo:
AppsFlyerLib.getInstance().sendPushNotificationData(this);
Để biết thêm thông tin về đo số lượng thông báo đẩy, hãy đọc tại đây.
Phân bổ Mời người dùng
Việc cho phép người dùng hiện tại mời bạn bè và những mối liên hệ của họ sử dụng ứng dụng có thể là một yếu tố tăng trưởng then chốt với ứng dụng của bạn. Với AppsFlyer, bạn có thể phân bổ và ghi nhận lượt cài đặt bắt nguồn từ lời mời của người dùng trong ứng dụng của bạn.
Để biết thêm chi tiết, hãy xem bài viết Phân bổ mời người dùng.
Phân bổ Quảng cáo chéo
11. Bộ định danh người dùng
Nhận ID AppsFlyer
ID AppsFlyer được tạo cho mỗi lần cài đặt mới ứng dụng. Bạn có thể sử dụng ID AppsFlyer cho nhiều mục đích khác nhau:
- Gửi các sự kiện trong ứng dụng server-to-server .
- Khớp ID AppsFlyer với hồ sơ người dùng trong các hệ thống backend của bạn.
- Ánh xạ các mục khi hợp nhất dữ liệu từ API kéo và đẩy.
Sử dụng API sau để lấy ID AppsFlyer:
public String getAppsFlyerUID(Context context);
Ví dụ cách dùng:
String appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
Thiết lập ID người dùng Customer User ID
Để thiết lập ID người dùng Customer User ID:
public void setCustomerUserId(String id);
Ví dụ cách dùng:
AppsFlyerLib.getInstance().setCustomerUserId("myId");
Chúng tôi khuyên bạn nên đặt Customer User ID sớm trong luồng của ứng dụng, vì nó chỉ được liên kết với các sự kiện được báo cáo sau khi thiết lập:
- Nếu
setCustomerUserId
được gọi trước khi gọistart
, Customer User ID sẽ xuất hiện trong các báo cáo dữ liệu thô cho các lượt cài đặt và sự kiện. - Nếu được đặt sau, Customer User ID chỉ được liên kết với các sự kiện được ghi lại sau khi đặt ID Người dùng Khách hàng.
Lấy Customer User ID:
Để tránh thiết lập lại giá trị ID Người dùng Khách hàng sau lần khởi chạy đầu tiên và để giảm các cuộc gọi đến máy chủ của bạn để lấy Customer User ID, bạn có thể kiểm tra xem giá trị của nó có trống hay không bằng cách:
AppsFlyerProperties.getInstance().getString(AppsFlyerProperties.APP_USER_ID)
Để biết thêm thông tin về Customer User ID, nhấp vào đây.
Trì hoãn Khởi tạo SDK cho customerUserID
Bạn có thể trì hoãn Khởi tạo SDK cho đến khi customerUserID được thiết lập.
Để chỉ ra rằng SDK sẽ trì hoãn việc khởi tạo cho cuộc gọi Customer User ID:
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
ngay trước khi thực hiện phương pháp init(). Phần còn lại của Khởi tạo SDK nên được giữ nguyên.
Khi đã được cung cấp customerUserID, hãy gọi
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
để cung cấp cho SDK customer user id liên quan và bắt đầu SDK.
Đoạn mã sẽ xuất hiện như sau:
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)
}
}
To learn more about delaying the SDK initialization until the Customer User ID is available, go here.
Cảnh báo
Chỉ sử dụng API này trong trường hợp phù hợp với logic kinh doanh của bạn. Sử dụng API này sẽ tăng cơ hội tạo ra sự khác biệt và có thể khiến ứng dụng dễ bị gian lận hơn.
ID quảng cáo Google
Kể từ SDK phiên bản 4.8.0, AppsFlyer tự động thu thập google_advertising_id
.
Yêu cầu thu thập ID Quảng cáo Google chỉ tương thích với SDK phiên bản 4.7.X trở xuống.
OAID, IMEI và ID Android
Phải thu thập ít nhất một mã định danh thiết bị duy nhất để có thể phân bổ. Các mã định danh sau đây khả dụng: GAID, ID Android, IMEI và OAID.
GAID - ID quảng cáo Google
Được thu thập tự động từ các ứng dụng có chứa Dịch vụ Google Play. Nếu GAID có sẵn ứng dụng KHÔNG nên thu thập IMEI và ID Android để tránh vi phạm chính sách của Google Play.
IMEI và Android ID
Disabled by default. Can be collected ONLY for apps that do NOT contain Google Play Services.
Note: Starting with Android 10 (API level 29), released in late 2019, access to the IMEI parameter is restricted.
Để gửi các ID này đến AppsFlyer:
- Trên ứng dụng, mở thu thập IMEI và/hoặc ID Android của thiết bị.
- Hãy gọi các API sau TRƯỚC KHI gọi phương thức
start
:
AppsFlyerLib.getInstance().setImeiData("IMEI_HERE"); AppsFlyerLib.getInstance().setAndroidIdData("ANDROID_ID_HERE");
OAID - Mã định danh nhà quảng cáo mở
Chọn không thu thập ID thiết bị
Các nhà phát triển có thể chọn không thu thập IMEI, ID Android và OAID bằng cách sử dụng các API sau:
AppsFlyerLib.getInstance().setCollectIMEI(false);
AppsFlyerLib.getInstance().setCollectAndroidID(false);
AppsFlyerLib.getInstance().setCollectOaid(false);
12. Quyền riêng tư của người dùng
Lựa chọn không tham gia
Trong một số trường hợp nghiêm trọng, bạn có thể sẽ phải tắt tất cả chức năng ghi nhật ký SDK để bảo đảm tuân thủ pháp luật và quyền riêng tư. Có thể thực hiện việc này bằng API isStopped. Khi API này được gọi, SDK sẽ ngừng hoạt động và không còn giao tiếp với các máy chủ AppsFlyer.
AppsFlyerLib.getInstance().isStopped(true, context);
There are several different scenarios for user opt-out. We highly recommend following the exact instructions for the scenario, that is relevant for your app.
Trong bất kỳ sự kiện nào, SDK có thể được kích hoạt lại bằng cách gọi API tương tự, nếu kết quả là sai.
Quan trọng
Không gọi start
nếu isStopped
được đặt là true
Để bắt đầu ghi nhật ký lại khi isStopped
được đặt thành false
, hãy sử dụng API SDK sau:
AppsFlyerLib.getInstance().start(getApplicationContext(), AF_DEV_KEY);
Cảnh báo
Chỉ sử dụng API dừng trong trường hợp bạn muốn hoàn toàn bỏ qua người dùng này trong mọi tính năng ghi nhật ký. Việc sử dụng API này ảnh hưởng NGHIÊM TRỌNG đến việc phân bổ, thu thập dữ liệu và cơ chế liên kết sâu của bạn.
Ẩn danh Dữ liệu Người dùng
Sử dụng API này trong quá trình Khởi tạo SDK để ẩn danh hoàn toàn các cài đặt, sự kiện và phiên của người dùng:
public void anonymizeUser(boolean isDisabled);
Ví dụ cách dùng:
AppsFlyerLib.getInstance().anonymizeUser(true);
Chức năng ghi nhật ký có thể được khởi động lại bằng cách gọi anonymizeUser
đặt thành false.
Cảnh báo
Việc ẩn danh người dùng sẽ làm ảnh hưởng NGHIÊM TRỌNG đến thông tin phân bổ của bạn.CHỈ sử dụng tùy chọn này cho các khu vực mà pháp luật nghiêm cấm thu thập thông tin của người dùng.
Loại trừ các đối tác không được lấy dữ liệu
Trong một số trường hợp, nhà quảng cáo có thể muốn ngừng chia sẻ dữ liệu cấp người dùng với các mạng/đối tác quảng cáo cho những người dùng cụ thể. Lý do cho điều này bao gồm:
- Các chính sách bảo mật như CCPA hoặc GDPR
- Cơ chế chọn lựa không tham gia của người dùng
- Cạnh tranh với một số đối tác (mạng quảng cáo, bên thứ 3)
AppsFlyer cung cấp hai phương thức API để ngừng chia sẻ dữ liệu với một số hoặc tất cả các đối tác:
- setSharingFilter: Được các nhà quảng cáo sử dụng để đặt một số (một hoặc nhiều) mạng/đối tác tích hợp đểloại trừ không được lấy dữ liệu.
- setSharingFilterForAllPartners: Được các nhà quảng cáo sử dụng để loại trừ tất cả các mạng/đối tác tích hợp không được lấy dữ liệu.
Các phương thức lọc này được hỗ trợ từ SDK V5.4.1.
Phương thức lọc phải được gọi mỗi khi SDK được khởi tạo và ảnh hưởng đến toàn phiên. Nếu cần thời gian để xác định xem bạn có cần đặt bộ lọc chia sẻ hay không, thì hãy trì hoãn quá trình khởi tạo SDK.
Khi phương thức này được kích hoạt trước lệnh gọi start đầu tiên:
- Người dùng từ SRN được phân bổ là Tự nhiên và dữ liệu của họ không được chia sẻ với các đối tác tích hợp.
- Người dùng từ mạng quảng cáo lượt nhấp (không phải SRN) được phân bổ chính xác trên AppsFlyer, nhưng không được chia sẻ với mạng quảng cáo thông qua postback, API, báo cáo dữ liệu thô hoặc bằng bất kỳ phương thức nào khác.
Hiện tại, không thể lọc dữ liệu gỡ cài đặt bằng các phương thức này. Tuy nhiên, bạn có thể ngừng gửi sự kiện Gỡ cài đặt cho đối tác bằng cách sử dụng trang thiết lập trong AppsFlyer.
getAppsFlyerUID
Mô tả |
Nhận ID AppsFlyer. Để biết thêm thông tin chi tiết, xem ở đây. |
Chữ ký Phương thức |
|
Ví dụ cách dùng |
|
onAppOpenAttribution
Mô tả |
Nhận dữ liệu liên kết sâu khi một ứng dụng mở thông qua một liên kết sâu. |
Chữ ký phương thức |
|
onAttributionFailure
Mô tả |
Xử lý lỗi khi nhận dữ liệu liên kết sâu. |
Chữ ký phương thức |
|
onConversionDataSuccess
Mô tả |
Nhận dữ liệu chuyển đổi sau khi cài đặt. Hữu ích cho liên kết sâu bị trì hoãn. Lưu ý: Bắt đầu SDK V5, |
Chữ ký phương thức |
|
onConversionDataFail
Mô tả |
Xử lý lỗi khi không nhận được dữ liệu chuyển đổi từ các lượt cài đặt. |
Chữ ký phương thức |
|
onDeepLinking
Mô tả |
Đưa người dùng di động đã cài đặt và chưa cài đặt ứng dụng của bạn đến một hoạt động trong ứng dụng cụ thể ngay sau khi ứng dụng được mở. Tìm hiểu thêm |
Chữ ký phương thức |
|
onRequestFailure
Mô tả |
Phương thức gọi lại cho AppsFlyerRequestListener. Được gọi khi SDK không báo cáo khởi chạy ứng dụng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
onRequestSuccess
Mô tả |
Phương thức gọi lại cho AppsFlyerRequestListener. Được gọi khi SDK báo cáo khởi chạy ứng dụng thành công. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
performOnAppAttribution
Mô tả |
Chức năng này cho phép các nhà phát triển kích hoạt lại onAppOpenAttribution theo cách thủ công bằng một liên kết cụ thể (URI hoặc URL), mà không cần ghi lại lượt thu hút lại mới. Phương thức này có thể được yêu cầu nếu ứng dụng cần chuyển hướng người dùng dựa trên liên kết đã cho hoặc giải quyết URL ngắn của AppsFlyer trong khi vẫn ở nền trước/mở. Điều này có thể cần thiết vì lệnh gọi lại onAppOpenAttribution thông thường chỉ được gọi nếu ứng dụng được mở bằng liên kết sâu. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
logSession
Mô tả |
Báo cáo các phiên nếu ứng dụng của bạn là ứng dụng tiện ích chạy trong nền. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
sendDeepLinkData (không còn được hỗ trợ từ V5.3.0)
Mô tả |
Phương thức này không còn được sử dụng để đảm bảo bạn nhận được dữ liệu phân bổ ngay cả khi người dùng được liên kết sâu vào một hoạt động cụ thể. Thay vào đó, hãy đảm bảo rằng start() được gọi. Để biết thêm thông tin chi tiết, xem ở đây. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
sendPushNotificationData
Mô tả |
Đo lường và nhận dữ liệu từ các chiến dịch thông báo đẩy. Để biết thêm thông tin, xem đo lường thông báo đẩy. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setAdditionalData
Mô tả |
Thêm dữ liệu bổ sung được gửi đến các nền tảng đối tác bên ngoài. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
setAndroidIdData
Mô tả |
Gửi ID Android đến AppsFlyer. Xem OAID, IMEI và ID Android. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setAppInviteOneLink
Mô tả |
Đặt ID mẫu OneLink được sử dụng để tạo liên kết phân bổ tùy chỉnh cho lời mời của người dùng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
Xem cài đặt OneLink để phân bổ lời mời người dùng. |
setCollectAndroidID
Mô tả |
Cho biết liệu Android ID có nên được gửi tới AppsFlyer hay không. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
setCollectIMEI
Mô tả |
Cho biết liệu IEMI có nên được gửi tới AppsFlyer hay không. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
setCustomerIdAndLogSession
Mô tả |
Bắt đầu SDK khi Customer User ID khả dụng. Để biết thêm thông tin, xem trì hoãn khởi tạo SDK cho Customer User ID của khách hàng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
Thiết lập ID người dùng Customer User ID
Mô tả |
Thiết lập Customer User ID. Để biết thêm thông tin, hãy xem thiết lập Customer User ID. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setDebugLog
Mô tả |
Cho phép ghi nhật ký gỡ lỗi. Xem gỡ lỗi cho Android. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
anonymizeUser
Mô tả |
Ẩn danh cài đặt, sự kiện và các phiên của người dùng. Để biết thêm thông tin, hãy xem ẩn danh dữ liệu người dùng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setLogLevel
Mô tả |
Thiết lập mức nhật ký SDK AppsFlyer. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setMinTimeBetweenSessions
Mô tả |
Thiết lập thời gian tối thiểu giữa các phiên. Để biết thêm thông tin, hãy xem thời gian tùy chỉnh giữa các phiên. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setOaidData
Mô tả |
Gửi OAID đến AppsFlyer. Xem OAID, IMEI và ID Android. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setOutOfStore
Mô tả |
Chỉ định cửa hàng ứng dụng thay thế mà ứng dụng được tải xuống từ đó. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setPreinstallAttribution
Mô tả |
Thiết lập SDK để báo cáo cài đặt sẵn khi một ứng dụng được cài đặt sẵn khởi chạy. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
setResolveDeepLinkURLs
Mô tả |
Giải quyết OneLink từ các miền nhấp chuột. Để biết thêm thông tin, vui lòng xem giải quyết các URL liên kết sâu được gói. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setSharingFilter
Mô tả |
Được các nhà quảng cáo sử dụng để đặt một số (một hoặc nhiều) mạng/đối tác tích hợp để loại trừ không được lấy dữ liệu. Tìm hiểu thêm |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
setSharingFilterForAllPartners
Mô tả |
Được nhà quảng cáo sử dụng để loại trừ tất cả các mạng/đối tác tích hợp không được lấy dữ liệu. Tìm hiểu thêm |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
start
Mô tả |
Bắt đầu SDK khi khởi chạy ứng dụng. Để biết thêm thông tin, vui lòng xem khởi tạo SDK. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
stop
Mô tả |
Tắt tất cả chức năng SDK. Để biết thêm thông tin, vui lòng xem quyền riêng tư của người dùng - từ chối. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
trackAppLaunch (không còn được hỗ trợ từ V5.2.0)
Mô tả |
Phương thức này không còn được hỗ trợ. Thay vào đó, hãy sử dụng start. Có hai chức năng:
|
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
logEvent
Mô tả |
Gửi các sự kiện trong ứng dụng tới AppsFlyer. Để biết thêm thông tin, vui lòng xem ghi nhận sự kiện trong ứng dụng. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
updateServerUninstallToken
Mô tả |
Đối với các nhà phát triển sử dụng Firebase cho các mục đích khác ngoài việc đo lường lượt gỡ cài đặt. Để biết thêm thông tin, vui lòng xem đo lường gỡ cài đặt. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
waitForCustomerUserId
Mô tả |
Trì hoãn khởi tạo SDK cho đến khi Customer User ID được thiết lập. |
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
appendParametersToDeepLinkingURL
Mô tả |
Cho phép chủ sở hữu ứng dụng sử dụng Liên kết Ứng dụng để liên kết sâu (không có OneLink) để phân bổ các phiên được khởi tạo thông qua miền được liên kết với ứng dụng của họ. Gọi ra phương thức này trước khi gọi lệnh start.
|
Chữ ký phương thức |
|
Ví dụ cách dùng |
|
Các API không còn được hỗ trợ
API không còn được hỗ trợ có nghĩa là phương thức sẽ được thay thế. Đây là thời điểm thích hợp để các nhà phát triển nâng cấp mã của họ.
Ngày ngừng hỗ trợ là khi phương thức ngừng hoạt động hoặc tiếp tục hoạt động với khả năng hạn chế.
API/tên giao diện | Không còn được hỗ trợ từ phiên bản | Ngày ngừng hỗ trợ | Đã thay đổi thành |
---|---|---|---|
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 |
Bình luận
Vui lòng đăng nhập để viết bình luận.