В данном руководстве описана процедура отправки данных о доходах на уровне показов (ILRD) из TopOn в Tenjin. Интеграция реализована на основе обработки определённого обратного вызова из SDK TopOn — onAdRevenuePaid(ATAdInfo adInfo) — который срабатывает каждый раз, когда показ рекламы приносит доход. Затем этот объект ATAdInfo, содержащий подробные данные о доходах, передается в SDK Tenjin.
В данном руководстве описан способ передачи данных о доходах на уровне показа рекламы (ILRD) из TopOn в Tenjin. Эта интеграция реализуется путем прослушивания определённого обратного вызова onAdRevenuePaid(ATAdInfo adInfo), который срабатывает каждый раз, когда показы рекламы приносят доход. Объект ATAdInfo, содержащий подробные данные о доходах, затем передается в SDK Tenjin.
Шаг 1: Проверка зависимостей проекта Шаг 1: Проверка зависимостей проекта #
Убедитесь, что в файле build.gradle на уровне вашего приложения указаны все необходимые зависимости. В файле build.gradle модуля вашего приложения убедитесь, что указаны все необходимые зависимости.
- Последняя версия TopOn SDK Последняя версия TopOn SDK
- Адаптеры рекламных сетей: Вы обязаны добавить адаптеры для каждой рекламной сети, с которой планируете работать через TopOn (например, AdMob, AppLovin, Unity Ads, Meta и т. д.). Адаптеры рекламных платформ: Вы должны добавить соответствующие адаптеры для каждой рекламной платформы, через которую вы планируете осуществлять агрегацию с помощью TopOn (например: AdMob, AppLovin, Unity Ads, Meta и т. д.).
// Example: app/build.gradle
dependencies {
// 1. TopOn (AnyThink) SDK Core
implementation 'com.anythink.sdk:core:6.4.17'
// 2. Adapters for ALL supported ad networks 所有支持的广告平台的 Adapter
implementation 'com.anythink.sdk:adapter-admob:6.4.17'
implementation 'com.anythink.sdk:adapter-applovin:6.4.17'
implementation 'com.anythink.sdk:adapter-unityads:6.4.17'
implementation 'com.anythink.sdk:adapter-meta:6.4.17'
// ... add every other adapter you use 添加您使用的所有其他 adapter
}Шаг 2: Инициализация SDK #
В методе onCreate вашего основного Activity инициализируйте SDK Tenjin и TopOn.
import com.anythink.core.API.ATSDK;
import com.tenjin.android.TenjinSDK;
// ... other imports
public class YourMainActivity extends Activity {
private TenjinSDK tenjinInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ... your other setup code
// 1. Initialize Tenjin 初始化 Tenjin
tenjinInstance = TenjinSDK.getInstance(this, "<Your Tenjin API Key>");
// 2. Initialize TopOn 初始化 TopOn
ATSDK.init(getApplicationContext(), "<Your TopOn App ID>", "<Your TopOn App Key>");
// 3. Load your ads 加载您的广告
loadAllAdFormats();
}
// ...
}Шаг 3: Настройте отслеживание доходов для КАЖДОГО формата рекламы #
Вы должны реализовать слушатель доходов для каждого используемого вами рекламного формата. Если отслеживание отсутствует даже для одного формата (например, «Rewarded Video»), все показы по этому формату не будут учитываться Tenjin. Правильный способ заключается в том, чтобы установить ATAdRevenueListener и вызвать метод eventAdImpressionTopOn() Tenjin изнутри обратного вызова onAdRevenuePaid().
private void loadBannerAd() {
ATBannerView mBannerView = new ATBannerView(this);
mBannerView.setPlacementId("<Your_Banner_Placement_ID>");
// ... add the banner view to your layout ...
// Set the revenue listener 设置收益监听
mBannerView.setAdRevenueListener(new ATAdRevenueListener() {
@Override
public void onAdRevenuePaid(ATAdInfo adInfo) {
// Send revenue data to Tenjin for every impression, including auto-refreshes
// 为每一次广告展示(包括自动刷新)向 Tenjin 发送收益数据
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}
});
mBannerView.loadAd();
}Б. Всплывающая реклама (Interstitial) #
private void loadInterstitialAd() {
ATInterstitial mInterstitialAd = new ATInterstitial(this, "<Your_Interstitial_Placement_ID>");
// Set the revenue listener
// 设置收益监听器
mInterstitialAd.setAdRevenueListener(new ATAdRevenueListener() {
@Override
public void onAdRevenuePaid(ATAdInfo adInfo) {
// Send revenue data to Tenjin
// 向 Tenjin 发送收益数据
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}
});
mInterstitialAd.load();
}C. Видеореклама с вознаграждением (Rewarded Video) #
private void loadRewardedVideoAd() {
ATRewardVideoAd mRewardVideoAd = new ATRewardVideoAd(this, "<Your_Rewarded_Placement_ID>");
// Set the revenue listener
// 设置收益监听器
mRewardVideoAd.setAdRevenueListener(new ATAdRevenueListener() {
@Override
public void onAdRevenuePaid(ATAdInfo adInfo) {
// Send revenue data to Tenjin
// 向 Tenjin 发送收益数据
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}
});
mRewardVideoAd.load();
}D. Нативная реклама (Native) и заставка (Splash) #
Вы должны строго следовать точно такому же шаблону для любых других используемых вами рекламных форматов, таких как нативная реклама (ATNativeAd) и заставка (ATSplashAd). Каждому рекламному объекту требуется собственный ATAdRevenueListener. Для любых других форматов рекламы, которые вы используете, например, нативной рекламы (ATNativeAd) и заставки (ATSplashAd), вы должны следовать точно такому же шаблону. Каждому рекламному объекту требуется собственный ATAdRevenueListener.
Шаг 4: Устранение конфликтов делегатов SDK #
Если вы используете другой сервис (например, Firebase, GameAnalytics и т. д.), который также отслеживает доход от рекламы TopOn, может возникнуть конфликт. Можно настроить только один слушатель. Если вы используете другие сервисы, которые также отслеживают доходы от рекламы TopOn (например, Firebase, GameAnalytics и т. д.), может возникнуть конфликт. Для одного события можно настроить только один слушатель.
- Симптом: Данные о показах отображаются корректно в одном сервисе, но отсутствуют в Tenjin. Симптом: Данные о показах отображаются корректно в одном сервисе, но отсутствуют в Tenjin.
- Решение: Не устанавливайте несколько слушателей. Вместо этого найдите место, где ваш другой сервис получает объект ATAdInfo из обратного вызова onAdRevenuePaid. В том же месте добавьте вызов Tenjin, чтобы оба сервиса получали данные. Решение: Не настраивайте несколько слушателей. Вместо этого найдите место, где ваш другой сервис получает объект ATAdInfo из обратного вызова onAdRevenuePaid. В том же месте добавьте вызов Tenjin, чтобы оба сервиса получали данные.
// Example of resolving a listener conflict
// 解决监听器冲突的示例
public void onAdRevenuePaid(ATAdInfo adInfo) {
// 1. Call for your other service
// 1. 为您的其他服务发起调用
callMyOtherAnalyticsService(adInfo);
// 2. [CRITICAL] Add the call to Tenjin in the same place
// 2. [关键] 在同一个地方添加对 Tenjin 的调用
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}