← 返回目录
📁 Marketing API › Ad Measurement › Guides › TikTok App Events SDK › Additional features

应用内广告收入报告

SDK 1.5.0 及以上版本支持报告应用内广告聚合收入。只需根据你使用的聚合合作伙伴,使用以下示例代码即可。

重要提示
使用 MAX 和 ironSource 聚合时,请务必以美元 (USD) 发送所有收入,以免出现报告错误。

Android

MAX

(code curl http)
MaxRewardedAd rewardedAd = MaxRewardedAd.getInstance("YOUR_AD_UNIT_ID", this);
rewardedAd.setRevenueListener(new MaxAdRevenueListener() {
    @Override
    public void onAdRevenuePaid(MaxAd maxAd) {
        double revenue = maxAd.getRevenue();
        String countryCode = AppLovinSdk.getInstance(context).getConfiguration().getCountryCode();
        String networkName = maxAd.getNetworkName();
        String adUnitId = maxAd.getAdUnitId();
        String format = maxAd.getFormat().toString();
        String placement = maxAd.getPlacement();
        String networkPlacement = maxAd.getNetworkPlacement();

        JSONObject adRevenueJson = new JSONObject();
        try {
            adRevenueJson.put("revenue", revenue);
            adRevenueJson.put("country_code", countryCode);
            adRevenueJson.put("network_name", networkName);
            adRevenueJson.put("ad_unit_id", adUnitId);
            adRevenueJson.put("ad_format", format);
            adRevenueJson.put("placement", placement);
            adRevenueJson.put("network_placement", networkPlacement);
            adRevenueJson.put("device_ad_mediation_platform", "applovin_max_sdk");
        } catch (JSONException e) {
        }

        // Make sure the App Events SDK has been initialized before calling this
        TTBaseEvent adRevenueInfo = TTAdRevenueEvent.newBuilder(adRevenueJson).build();
        TikTokBusinessSdk.trackTTEvent(adRevenueInfo);
    }
});
(/code)

ironSource

(code curl http)
/**
 * If you want to add the ImpressionData listener to your application,
 * make sure you declare the listener before initializing the ironSource SDK,
 * to avoid any loss of information.
 */
IronSource.addImpressionDataListener(new ImpressionDataListener() {
    @Override
    public void onImpressionSuccess(ImpressionData impressionData) {
        String auctionId = impressionData.getAuctionId();
        String adUnit = impressionData.getAdUnit();
        String adNetwork = impressionData.getAdNetwork();
        String instanceName = impressionData.getInstanceName();
        String instanceId = impressionData.getInstanceId();
        String country = impressionData.getCountry();
        String placement = impressionData.getPlacement();
        Double revenue = impressionData.getRevenue();
        String precision = impressionData.getPrecision();
        String ab = impressionData.getAb();
        String segmentName = impressionData.getSegmentName();
        Double lifetimeRevenue = impressionData.getLifetimeRevenue();
        String encryptedCPM = impressionData.getEncryptedCPM();

        JSONObject adRevenueJson = new JSONObject();
        try {
            adRevenueJson.put("auction_id", auctionId);
            adRevenueJson.put("ad_unit", adUnit);
            adRevenueJson.put("ad_network", adNetwork);
            adRevenueJson.put("instance_name", instanceName);
            adRevenueJson.put("instance_id", instanceId);
            adRevenueJson.put("country", country);
            adRevenueJson.put("placement", placement);
            adRevenueJson.put("revenue", revenue);
            adRevenueJson.put("precision", precision);
            adRevenueJson.put("ab", ab);
            adRevenueJson.put("segment_name", segmentName);
            adRevenueJson.put("lifetime_revenue", lifetimeRevenue);
            adRevenueJson.put("encrypted_cpm", encryptedCPM);
            adRevenueJson.put("device_ad_mediation_platform", "ironsource_sdk");
        } catch (JSONException e) {
        }

        // Make sure the App Events SDK has been initialized before calling this
        TTBaseEvent adRevenueInfo = TTAdRevenueEvent.newBuilder(adRevenueJson).build();
        TikTokBusinessSdk.trackTTEvent(adRevenueInfo);
    }
});
(/code)

AdMob

(code curl http)
AdRequest adRequest = new AdRequest.Builder().build();
RewardedAd.load(this, "your ad unit ID", adRequest, new RewardedAdLoadCallback() {
    @Override
    public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
        rewardedAd.setOnPaidEventListener(new OnPaidEventListener() {
            @Override
            public void onPaidEvent(@NonNull AdValue adValue) {
                AdapterResponseInfo loadedAdapterResponseInfo = rewardedAd.getResponseInfo().getLoadedAdapterResponseInfo();
                Bundle responseExtras = rewardedAd.getResponseInfo().getResponseExtras();
                JSONObject adRevenueJson = new JSONObject();

                long value = adValue.getValueMicros();
                String currencyCode = adValue.getCurrencyCode();
                int precisionType = adValue.getPrecisionType();
                String adUnitId = rewardedAd.getAdUnitId();
                String adSourceName = "";
                String adSourceId = "";
                String adSourceInstanceName = "";
                String adSourceInstanceId = "";
                String mediationGroupName = "";
                String mediationAbTestName = "";
                String mediationAbTestVariant = "";
                if (loadedAdapterResponseInfo != null){
                    adSourceName = loadedAdapterResponseInfo.getAdSourceName();
                    adSourceId = loadedAdapterResponseInfo.getAdSourceId();
                    adSourceInstanceName = loadedAdapterResponseInfo.getAdSourceInstanceName();
                    adSourceInstanceId = loadedAdapterResponseInfo.getAdSourceInstanceId();
                }
                if (responseExtras != null){
                    mediationGroupName = responseExtras.getString("mediation_group_name");
                    mediationAbTestName = responseExtras.getString("mediation_ab_test_name");
                    mediationAbTestVariant = responseExtras.getString("mediation_ab_test_variant");
                }
                try {
                    adRevenueJson.put("value", value);
                    adRevenueJson.put("currency_code", currencyCode);
                    adRevenueJson.put("precision", precisionType);
                    adRevenueJson.put("ad_unit_id", adUnitId);
                    adRevenueJson.put("ad_source_name", adSourceName);
                    adRevenueJson.put("ad_source_id", adSourceId);
                    adRevenueJson.put("ad_source_instance_name", adSourceInstanceName);
                    adRevenueJson.put("ad_source_instance_id", adSourceInstanceId);
                    adRevenueJson.put("mediation_group_name", mediationGroupName);
                    adRevenueJson.put("mediation_ab_test_name", mediationAbTestName);
                    adRevenueJson.put("mediation_ab_test_variant", mediationAbTestVariant);
                    adRevenueJson.put("device_ad_mediation_platform", "admob_sdk");

                    //banner/interstitial/rewarded/rewarded interstitial/native/splash
                    adRevenueJson.put("ad_format", "rewarded");
                } catch (JSONException e) {
                }

                // Make sure the App Events SDK has been initialized before calling this
                TTBaseEvent adRevenueInfo = TTAdRevenueEvent.newBuilder(adRevenueJson).build();
                TikTokBusinessSdk.trackTTEvent(adRevenueInfo);
            }
        });
    }
});
(/code)

其他聚合平台

(code curl http)
JSONObject adRevenueJson = new JSONObject();
try {
    adRevenueJson.put("device_ad_mediation_platform", "<publisher sdk>");
    adRevenueJson.put("value", "<value>");
    adRevenueJson.put("currency", "<ISO 3-letter currency code e.g. USD>");
    adRevenueJson.put("location_country", "<ISO 2-letter country code e.g. US>");
    adRevenueJson.put("ad_revenue_network", "<Ad source/network, e.g. AdMob>");
    adRevenueJson.put("ad_format", "Ad unit format, e.g. banner|interstitial|native|rewarded");
    adRevenueJson.put("precision", "Ad revenue precision level");
} catch (JSONException e) {
}
// Make sure the App Events SDK has been initialized before calling this
TTBaseEvent adRevenueInfo = TTAdRevenueEvent.newBuilder(adRevenueJson).build();
TikTokBusinessSdk.trackTTEvent(adRevenueInfo);
(/code)

iOS

MAX

(code curl http)
// Obj-C

- (void)didPayRevenueForAd:(MAAd *)ad {

    double revenue = ad.revenue;
    NSString *countryCode = [ALSdk shared].configuration.countryCode;
    NSString *networkName = ad.networkName;
    NSString *adUnitId = ad.adUnitIdentifier;
    MAAdFormat *adFormat = ad.format;
    NSString *placement = ad.placement;
    NSString *networkPlacement = ad.networkPlacement;
    NSString *adUnitIdentifier = ad.adUnitIdentifier;

    NSMutableDictionary *adRevenue = NSMutableDictionary.dictionary;
    [adRevenue setObject:@"applovin_max_sdk" forKey:@"device_ad_mediation_platform"];
    [adRevenue setObject:@(revenue) forKey:@"revenue"];
    [adRevenue setObject:countryCode forKey:@"country_code"];
    [adRevenue setObject:networkName forKey:@"network_name"];
    [adRevenue setObject:adFormat.label forKey:@"ad_format"];
    [adRevenue setObject:placement forKey:@"placement"];
    [adRevenue setObject:networkPlacement forKey:@"network_placement"];
    [adRevenue setObject:adUnitIdentifier forKey:@"ad_unit_id"];

    // Make sure the App Events SDK has been initialized before calling this
    TikTokAdRevenueEvent *adRevenueEvent = [[TikTokAdRevenueEvent alloc] initWithAdRevenue:adRevenue];
    [TikTokBusiness trackTTEvent:adRevenueEvent];
}
(/code)

ironSource

(code curl http)
// Obj-C

- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {

    NSString *auction_id = impressionData.auction_id;
    NSString *ad_unit = impressionData.ad_unit;
    NSString *ad_network = impressionData.ad_network;
    NSString *instance_name = impressionData.instance_name;
    NSString *instance_id = impressionData.instance_id;
    NSString *country = impressionData.country;
    NSString *placement = impressionData.placement;
    NSNumber *revenue = impressionData.revenue;
    NSString *precision = impressionData.precision;
    NSString *ab = impressionData.ab;
    NSString *segment_name = impressionData.segment_name;
    NSNumber *lifetime_revenue = impressionData.lifetime_revenue;
    NSString *encrypted_cpm = impressionData.encrypted_cpm;
    NSNumber *conversion_value = impressionData.conversion_value;

    NSMutableDictionary *adRevenue = NSMutableDictionary.dictionary;
    [adRevenue setObject:@"ironsource_sdk" forKey:@"device_ad_mediation_platform"];
    [adRevenue setObject:auction_id forKey:@"auction_id"];
    [adRevenue setObject:ad_unit forKey:@"ad_unit"];
    [adRevenue setObject:ad_network forKey:@"ad_network"];
    [adRevenue setObject:instance_name forKey:@"instance_name"];
    [adRevenue setObject:instance_id forKey:@"instance_id"];
    [adRevenue setObject:country forKey:@"country"];
    [adRevenue setObject:placement forKey:@"placement"];
    [adRevenue setObject:revenue forKey:@"revenue"];
    [adRevenue setObject:precision forKey:@"precision"];
    [adRevenue setObject:ab forKey:@"ab"];
    [adRevenue setObject:segment_name forKey:@"segment_name"];
    [adRevenue setObject:lifetime_revenue forKey:@"lifetime_revenue"];
    [adRevenue setObject:encrypted_cpm forKey:@"encrypted_cpm"];
    [adRevenue setObject:conversion_value forKey:@"conversion_value"];

    // Make sure the App Events SDK has been initialized before calling this
    TikTokAdRevenueEvent *adRevenueEvent = [[TikTokAdRevenueEvent alloc] initWithAdRevenue:adRevenue];
    [TikTokBusiness trackTTEvent:adRevenueEvent];
}
(/code)

AdMob

(code curl http)
// Obj-C

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController

- (void)requestRewardedAd {

    __weak ViewController *weakSelf = self;
    GADRequest *request = [GADRequest request];

    [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                            request:request
                  completionHandler:^(GADRewardedAd *ad, NSError *error) {

        if (error) {
            NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
            return;
        }

        self.rewardedAd = ad;
        self.rewardedAd.paidEventHandler = ^void(GADAdValue *_Nonnull value) {

            ViewController *strongSelf = weakSelf;
            NSDecimalNumber *revenueValue = value.value;
            NSString *currencyCode = value.currencyCode;
            GADAdValuePrecision precision = value.precision;
            NSString *adUnitId = strongSelf.rewardedAd.adUnitID;
            GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo = strongSelf.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
            NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
            NSString *adSourceID = loadedAdNetworkResponseInfo.adSourceID;
            NSString *adSourceInstanceName = loadedAdNetworkResponseInfo.adSourceInstanceName;
            NSString *adSourceInstanceID = loadedAdNetworkResponseInfo.adSourceInstanceID;
            NSDictionary<NSString *, id> *extras = strongSelf.rewardedAd.responseInfo.extrasDictionary;
            NSString *mediationGroupName = extras[@"mediation_group_name"];
            NSString *mediationABTestName = extras[@"mediation_ab_test_name"];
            NSString *mediationABTestVariant = extras[@"mediation_ab_test_variant"];

            NSMutableDictionary *adRevenue = NSMutableDictionary.dictionary;
            [adRevenue setObject:@"admob_sdk" forKey:@"device_ad_mediation_platform"];
            [adRevenue setObject:revenueValue forKey:@"value"];
            [adRevenue setObject:currencyCode forKey:@"currency_code"];
            [adRevenue setObject:@(precision) forKey:@"precision"];
            [adRevenue setObject:adUnitId forKey:@"ad_unit_id"];
            [adRevenue setObject:adSourceName forKey:@"ad_source_name"];
            [adRevenue setObject:adSourceID forKey:@"ad_source_id"];
            [adRevenue setObject:adSourceInstanceName forKey:@"ad_source_instance_name"];
            [adRevenue setObject:adSourceInstanceID forKey:@"ad_source_instance_id"];
            [adRevenue setObject:mediationGroupName forKey:@"mediation_group_name"];
            [adRevenue setObject:mediationABTestName forKey:@"mediation_ab_test_name"];
            [adRevenue setObject:mediationABTestVariant forKey:@"mediation_ab_test_variant"];

            // banner/interstitial/rewarded/rewarded interstitial/native/splash
            [adRevenue setObject:@"rewarded" forKey:@"ad_format"];

            // Make sure the App Events SDK has been initialized before calling this
            TikTokAdRevenueEvent *adRevenueEvent = [[TikTokAdRevenueEvent alloc] initWithAdRevenue:adRevenue];
            [TikTokBusiness trackTTEvent:adRevenueEvent];
        };
    }];
}

@end
(/code)

其他聚合平台

(code curl http)
// Obj-C

NSMutableDictionary *adRevenue = NSMutableDictionary.dictionary;
[adRevenue setObject:@"<publisher sdk>" forKey:@"device_ad_mediation_platform"];
[adRevenue setObject:@"<value>" forKey:@"value"];
[adRevenue setObject:@"<ISO 3-letter currency code e.g. USD>" forKey:@"currency"];
[adRevenue setObject:@"<ISO 2-letter country code e.g. US>" forKey:@"location_country"];
[adRevenue setObject:@"<Ad source/network, e.g. AdMob>" forKey:@"ad_revenue_network"];
[adRevenue setObject:@"Ad unit format, e.g. banner|interstitial|native|rewarded" forKey:@"ad_format"];
[adRevenue setObject:@"Ad revenue precision level" forKey:@"precision"];

// Make sure the App Events SDK has been initialized before calling this
TikTokAdRevenueEvent *adRevenueEvent = [[TikTokAdRevenueEvent alloc] initWithAdRevenue:adRevenue];
[TikTokBusiness trackTTEvent:adRevenueEvent];
(/code)

Unity

MAX

(code curl http)
private void OnAdRevenuePaidEvent(string adUnitId, MaxSdk.AdInfo adInfo)
{
  double revenue = adInfo.Revenue;

  // Miscellaneous data
  string countryCode = MaxSdk.GetSdkConfiguration().CountryCode;
  string networkName = adInfo.NetworkName; 
  string adUnitIdentifier = adInfo.AdUnitIdentifier; 
  string placement = adInfo.Placement; 
  string networkPlacement = adInfo.NetworkPlacement; 
  string format = adInfo.AdFormat;

  Dictionary<string, object> adRevenue = new Dictionary<string, object>();
  adRevenue.Add("device_ad_mediation_platform","applovin_max_sdk");
  adRevenue.Add("revenue",revenue);
  adRevenue.Add("country_code",countryCode);
  adRevenue.Add("network_name",networkName);
  adRevenue.Add("ad_format",format);  
  adRevenue.Add("ad_unit_id",adUnitIdentifier);
  adRevenue.Add("placement",placement);
  adRevenue.Add("network_placement",networkPlacement);

  // Make sure the App Events SDK has been initialized before calling this
  TikTokAdRevenueEvent adRevenueEvent = new TikTokAdRevenueEvent(adRevenue);
  TikTokBusinessSDK.TrackTTEvent(adRevenueEvent);
}
(/code)

ironSource

(code curl http)
private void ImpressionDataReadyEvent(IronSourceImpressionData impressionData)
{
    String auction_id = impressionData.auctionId;
    String ad_unit = impressionData.adUnit;
    String ad_network = impressionData.adNetwork;
    String instance_name = impressionData.instanceName;
    String instance_id = impressionData.instanceId;
    String country = impressionData.country;
    String placement = impressionData.placement;
    Double revenue = impressionData.revenue;
    String precision = impressionData.precision;
    String ab = impressionData.ab;
    String segment_name = impressionData.segmentName;
    Double lifetime_revenue = impressionData.lifetimeRevenue;
    String encrypted_cpm = impressionData.encryptedCPM;
    String conversion_value = impressionData.creativeId;

    Dictionary<string, object> adRevenue = new Dictionary<string, object>();
    adRevenue.Add("device_ad_mediation_platform","ironsource_sdk");
    adRevenue.Add("auction_id",auction_id);
    adRevenue.Add("ad_unit",ad_unit);
    adRevenue.Add("ad_network",ad_network);
    adRevenue.Add("instance_name",instance_name);
    adRevenue.Add("instance_id",instance_id);
    adRevenue.Add("country",country);
    adRevenue.Add("placement",placement);
    adRevenue.Add("revenue",revenue);
    adRevenue.Add("precision",precision);
    adRevenue.Add("ab",ab);
    adRevenue.Add("segment_name",segment_name);
    adRevenue.Add("lifetime_revenue",lifetime_revenue);
    adRevenue.Add("encrypted_cpm",encrypted_cpm);
    adRevenue.Add("conversion_value",conversion_value);

    // Make sure the App Events SDK has been initialized before calling this
    TikTokAdRevenueEvent adRevenueEvent = new TikTokAdRevenueEvent(adRevenue);
    TikTokBusinessSDK.TrackTTEvent(adRevenueEvent);
}
(/code)

AdMob

(code curl http)
private RewardedAd _rewardedAd;

private void LoadRewardedAd()
{
    AdRequest adRequest = new AdRequest();
    RewardedAd.Load("AD_UNIT_ID", adRequest, (RewardedAd rewardedAd, LoadAdError error) =>
   {      
       _rewardedAd = rewardedAd;
       if (error != null)      
       {         
           Debug.LogError("Rewarded ad failed to load an ad with error : " + error);              return;      
       }      
       rewardedAd.OnAdPaid += this.HandleAdPaidEvent;   
  });
}

public void HandleAdPaidEvent(AdValue adValue)
{
    long valueMicros = adValue.Value;    
    string currencyCode = adValue.CurrencyCode;    
    PrecisionType precision = adValue.Precision;    
    ResponseInfo responseInfo = rewardedAd.GetResponseInfo();    
    string responseId = responseInfo.GetResponseId();    
    AdapterResponseInfo loadedAdapterResponseInfo =  responseInfo.GetLoadedAdapterResponseInfo();    
    string adSourceId = loadedAdapterResponseInfo.AdSourceId;    
    string adSourceInstanceId = loadedAdapterResponseInfo.AdSourceInstanceId;    
    string adSourceInstanceName = loadedAdapterResponseInfo.AdSourceInstanceName;    
    string adSourceName = loadedAdapterResponseInfo.AdSourceName;    
    string adapterClassName = loadedAdapterResponseInfo.AdapterClassName;    
    long latencyMillis = loadedAdapterResponseInfo.LatencyMillis;             
    Dictionary credentials = loadedAdapterResponseInfo.AdUnitMapping; 
    Dictionary extras = responseInfo.GetResponseExtras();    
    string mediationGroupName = extras["mediation_group_name"];    
    string mediationABTestName = extras["mediation_ab_test_name"];    
    string mediationABTestVariant = extras["mediation_ab_test_variant"];

    Dictionary adRevenue = new Dictionary();
    adRevenue.Add("device_ad_mediation_platform","admob_sdk");
    adRevenue.Add("value",valueMicros);
    adRevenue.Add("currency_code",currencyCode);
    adRevenue.Add("precision",precision);
    adRevenue.Add("ad_unit_id",_rewardedAd.getAdUnitId());   
    adRevenue.Add("ad_source_name",adSourceName);
    adRevenue.Add("ad_source_id",adSourceId);
    adRevenue.Add("ad_source_instance_name",adSourceInstanceName);
    adRevenue.Add("ad_source_instance_id",adSourceInstanceId);
    adRevenue.Add("mediation_group_name",mediationGroupName);
    adRevenue.Add("mediation_ab_test_name",mediationABTestName);
    adRevenue.Add("mediation_ab_test_variant",mediationABTestVariant);
    *            *
    *//banner/interstitial/rewarded/rewarded interstitial/native/app open ad*
    adRevenue.Add("ad_format","rewarded");

    // Make sure the App Events SDK has been initialized before calling this
    TikTokAdRevenueEvent adRevenueEvent = new TikTokAdRevenueEvent(adRevenue);
    TikTokBusinessSDK.TrackTTEvent(adRevenueEvent);

}
(/code)

其他聚合平台

(code curl http)
Dictionary<string, object> adRevenue = new Dictionary<string, object>();
adRevenue.Add("device_ad_mediation_platform","<publisher sdk>");
adRevenue.Add("value","<value>");
adRevenue.Add("currency","<ISO 3-letter currency code e.g. USD>");
adRevenue.Add("location_country","<ISO 2-letter country code e.g. US>");
adRevenue.Add("ad_revenue_network","<Ad source/network, e.g. AdMob>");
adRevenue.Add("ad_format","Ad unit format, e.g. banner|interstitial|native|rewarded");  
adRevenue.Add("precision","Ad revenue precision level");

// Make sure the App Events SDK has been initialized before calling this
TikTokAdRevenueEvent adRevenueEvent = new TikTokAdRevenueEvent(adRevenue);
TikTokBusinessSDK.TrackTTEvent(adRevenueEvent);
(/code)

内容来源:TikTok API for Business 官方文档 · 本地归档

在接这个接口时卡住了?
Stuck wiring this API into production? We build ad-delivery tooling on these platforms — campaign automation, reporting pipelines, error-handling and migration between API versions.
联系我们 · Talk to us 每日平台更新简报 →