구글 애드몹 (AdMob)

알립니다

이 기능은 베타 서비스입니다. 문의사항은 에어브릿지 CSM을 통해 전달해 주세요. 담당 CSM이 없는 경우 문의하기를 통해 전달해 주세요.

에어브릿지와 구글의 애드몹(AdMob)을 연동해 광고로 발생한 수익과 관련된 데이터를 에어브릿지 대시보드에서 확인할 수 있습니다. 에어브릿지는 구글의 애드몹과 SDK 연동을 지원합니다.

SDK 연동하기

아래 링크에 따라 애드몹 SDK를 설치해 주세요.

에어브릿지로 광고 수익 데이터 전송하기

애드몹의 광고 수익 데이터는 노출 수준 광고 수익 기능을 설정해야 수집할 수 있습니다. 애드몹 가이드를 참고해 주세요.

애드몹에서 발생한 광고 수익 데이터를 에어브릿지로 전송합니다. 애드몹 SDK에 광고 수익 데이터 콜백을 설정합니다. 해당 콜백을 활용하여 광고 수익 데이터를 에어브릿지 SDK로 전송합니다.

애드몹 SDK는 플랫폼에 따라 전송하는 광고 수익 데이터가 다릅니다. 예를 들어, 서비스에서 발생한 광고 수익이 0.005 달러라면 유니티와 안드로이드에서는 5000이 전송됩니다. iOS에서는 0.005가 전송됩니다. 아래 코드에서는 모든 플랫폼에서 에어브릿지 SDK에 value로 0.005를 입력합니다. 또한, semanticAttributes.adPartners.admob.value_micros에는 5000을 입력합니다.

Android SDK (v4)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
fun requestRewardedAd(context: Context) {
    val adRequest = AdRequest.Builder().build()

    RewardedAd.load(context, "ad unit ID", adRequest, object : RewardedAdLoadCallback() {
        override fun onAdLoaded(ad: RewardedAd) {
            ad.onPaidEventListener = OnPaidEventListener { adValue ->
                // Extract the impression-level ad revenue data.
                val valueMicros = adValue.valueMicros
                val currencyCode = adValue.currencyCode
                val precision = adValue.precisionType

                // Get the ad unit ID.
                val adUnitId = ad.adUnitId
                val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
                val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo

                // Available adFormat values:
                // "rewarded_video" - for rewarded ads
                // "interstitial" - for interstitial ads
                // "banner" - for banner ads
                // "native" - for native ads
                val adFormat = "rewarded_video"

                Airbridge.trackEvent(AirbridgeCategory.AD_IMPRESSION,
                    mapOf(
                        AirbridgeAttribute.ACTION to adUnitId,
                        AirbridgeAttribute.LABEL to adNetworkAdapter,
                        AirbridgeAttribute.VALUE to valueMicros / 1000000.0,
                        AirbridgeAttribute.AD_PARTNERS to mapOf(
                            "admob" to mapOf(
                                "value_micros" to valueMicros,
                                "currency_code" to currencyCode,
                                "precision" to precision,
                                "ad_unit_id" to adUnitId,
                                "ad_network_adapter" to adNetworkAdapter,
                                "ad_network" to loadedAdapterResponseInfo?.adSourceName,
                                "ad_revenue_format" to adFormat
                            )
                        ),
                        AirbridgeAttribute.CURRENCY to currencyCode
                    )
                )
            }
        }
    })
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
void requestRewardedAd(Context context) {
    AdRequest adRequest = new AdRequest.Builder().build();

    RewardedAd.load(context, "ad unit ID", adRequest, new RewardedAdLoadCallback(){
        @Override
        public void onAdLoaded(@NonNull RewardedAd ad) {
            // Set paid event listener
            ad.setOnPaidEventListener(new OnPaidEventListener() {
                @Override
                public void onPaidEvent(AdValue adValue) {
                    // Extract the impression-level ad revenue data.
                    long valueMicros = adValue.getValueMicros();
                    String currencyCode = adValue.getCurrencyCode();
                    int precision = adValue.getPrecisionType();

                    // Get the ad unit ID.
                    String adUnitId = ad.getAdUnitId();
                    String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
                    AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
                    String adSourceName = loadedAdapterResponseInfo.getAdSourceName();

                    // Available adFormat values:
                    // "rewarded_video" - for rewarded ads
                    // "interstitial" - for interstitial ads
                    // "banner" - for banner ads
                    // "native" - for native ads
                    String adFormat = "rewarded_video";

                    Airbridge.trackEvent(AirbridgeCategory.AD_IMPRESSION,
                        new HashMap<String, Object>() {{
                            put(AirbridgeAttribute.ACTION, adUnitId);
                            put(AirbridgeAttribute.LABEL, adNetworkAdapter);
                            put(AirbridgeAttribute.VALUE, valueMicros / 1000000.0);
                            put(AirbridgeAttribute.AD_PARTNERS, new HashMap<String, Object>() {{
                                put("admob", new HashMap<String, Object>() {{
                                    put("value_micros", valueMicros);
                                    put("currency_code", currencyCode);
                                    put("precision", precision);
                                    put("ad_unit_id", adUnitId);
                                    put("ad_network_adapter", adNetworkAdapter);
                                    put("ad_network", adSourceName);
                                    put("ad_revenue_format", adFormat);
                                }});
                            }});
                            // ironSource has a default currency of USD
                            put(AirbridgeAttribute.CURRENCY, currencyCode);
                        }}
                    );
                }
            });
        }
    });
}

Android SDK (Previous)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
fun requestRewardedAd(context: Context) {
    val adRequest = AdRequest.Builder().build()

    RewardedAd.load(context, "ad unit ID", adRequest, object : RewardedAdLoadCallback() {
        override fun onAdLoaded(ad: RewardedAd) {
            ad.onPaidEventListener = OnPaidEventListener { adValue ->
                // Extract the impression-level ad revenue data.
                val valueMicros = adValue.valueMicros
                val currencyCode = adValue.currencyCode
                val precision = adValue.precisionType

                // Get the ad unit ID.
                val adUnitId = ad.adUnitId
                val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
                val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo

                // Available adFormat values:
                // "rewarded_video" - for rewarded ads
                // "interstitial" - for interstitial ads
                // "banner" - for banner ads
                // "native" - for native ads
                val adFormat = "rewarded_video"

                val event = Event("airbridge.adImpression")
                val admob = mutableMapOf<String, Any?>()
                admob["value_micros"] = valueMicros
                admob["currency_code"] = currencyCode
                admob["precision"] = precision
                admob["ad_unit_id"] = adUnitId
                admob["ad_network_adapter"] = adNetworkAdapter
                admob["ad_network"] = loadedAdapterResponseInfo?.adSourceName
                admob["ad_revenue_format"] = adFormat

                val adPartners = mapOf("admob" to admob)
                event.action = adUnitId
                event.label = adNetworkAdapter
                event.value = valueMicros / 1000000.0
                event.semanticAttributes = mutableMapOf(
                    "adPartners" to adPartners,
                    "currency" to currencyCode
                )
                Airbridge.trackEvent(event)
            }
        }
    })
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
void requestRewardedAd(Context context) {
    AdRequest adRequest = new AdRequest.Builder().build();

    RewardedAd.load(context, "ad unit ID", adRequest, new RewardedAdLoadCallback(){
        @Override
        public void onAdLoaded(@NonNull RewardedAd ad) {
            // Set paid event listener
            ad.setOnPaidEventListener(new OnPaidEventListener() {
                @Override
                public void onPaidEvent(AdValue adValue) {
                    // Extract the impression-level ad revenue data.
                    long valueMicros = adValue.getValueMicros();
                    String currencyCode = adValue.getCurrencyCode();
                    int precision = adValue.getPrecisionType();

                    // Get the ad unit ID.
                    String adUnitId = ad.getAdUnitId();
                    String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
                    AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
                    String adSourceName = loadedAdapterResponseInfo.getAdSourceName();

                    // Available adFormat values:
                    // "rewarded_video" - for rewarded ads
                    // "interstitial" - for interstitial ads
                    // "banner" - for banner ads
                    // "native" - for native ads
                    String adFormat = "rewarded_video";

                    Event event = new Event("airbridge.adImpression");
                    Map<String, Object> admob = new HashMap<>();
                    admob.put("value_micros", valueMicros);
                    admob.put("currency_code", currencyCode);
                    admob.put("precision", precision);
                    admob.put("ad_unit_id", adUnitId);
                    admob.put("ad_network_adapter", adNetworkAdapter);
                    admob.put("ad_network", adSourceName);
                    admob.put("ad_revenue_format", adFormat);

                    Map<String, Object> adPartners = new HashMap<>();
                    adPartners.put("admob", admob);
                    Map<String, Object> semanticAttributes = new HashMap<>();
                    semanticAttributes.put("adPartners", adPartners);
                    semanticAttributes.put("currency", currencyCode);

                    event.setAction(adUnitId);
                    event.setLabel(adNetworkAdapter);
                    event.setValue(valueMicros / 1000000.0);
                    event.setSemanticAttributes(semanticAttributes);

                    Airbridge.trackEvent(event);
                }
            });
        }
    });
}

iOS SDK (v4)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
import GoogleMobileAds
import Airbridge
import UIKit

class ViewController: UIViewController {
    var rewardedAd: GADRewardedAd? = nil
    
    func requestRewardedAd() {
        let request = GADRequest()
        GADRewardedAd.load(
            withAdUnitID: "ad unit ID",
            request: request
        ) { ad, error in
            if let error {
                print("Rewarded ad failed to load with error: \(error.localizedDescription)")
                return
            }
            
            self.rewardedAd = ad
            self.rewardedAd?.paidEventHandler = { value in
                let (value, currencyCode, precision) = (
                    value.value,
                    value.currencyCode,
                    value.precision
                )
                
                let adUnitID = self.rewardedAd?.adUnitID
                let adNetworkAdapter = self.rewardedAd?.responseInfo?.adNetworkClassName
                let adSourceName = self.rewardedAd?.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName

                // Available adFormat values:
                // "rewarded_video" - for rewarded ads
                // "interstitial" - for interstitial ads
                // "banner" - for banner ads
                // "native" - for native ads
                let adFormat = "rewarded_video"

                Airbridge.trackEvent(
                    category: AirbridgeCategory.AD_IMPRESSION,
                    semanticAttributes: [
                        AirbridgeAttribute.ACTION: adUnitID,
                        AirbridgeAttribute.LABEL: adNetworkAdapter,
                        AirbridgeAttribute.VALUE: value,
                        AirbridgeAttribute.AD_PARTNERS: [
                            "admob": [
                                "value_micros": value * 1000000.0,
                                "currency_code": currencyCode,
                                "precision": precision,
                                "ad_unit_id": adUnitID,
                                "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                                "ad_network": adSourceName ?? NSNull(),
                                "ad_revenue_format": adFormat
                            ]
                        ],
                        AirbridgeAttribute.CURRENCY: currencyCode
                    ]
                )
            }
        }
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
@import GoogleMobileAds;
@import Airbridge;
@import UIKit;

@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 adValue) {
            ViewController* strongSelf = weakSelf;

            // Extract the impression-level ad revenue data.
            NSDecimalNumber* value; = adValue.value;
            NSString* currencyCode = adValue.currencyCode;
            GADAdValuePrecision precision = adValue.precision;

            // Get the ad unit ID.
            NSString* adUnitId = strongSelf.rewardedAd.adUnitID;
            
            NSString* adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
            GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                    strongSelf.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
            NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;

            // Available adFormat values:
            // "rewarded_video" - for rewarded ads
            // "interstitial" - for interstitial ads
            // "banner" - for banner ads
            // "native" - for native ads
            NSString *adFormat = @"rewarded_video"

            [Airbridge trackEventWithCategory:AirbridgeCategory.AD_IMPRESSION semanticAttributes:@{
                AirbridgeAttribute.ACTION: adUnitID,
                AirbridgeAttribute.LABEL: adNetworkAdapter,
                AirbridgeAttribute.VALUE: value,
                AirbridgeAttribute.AD_PARTNERS: @{
                    @"admob": @{
                        @"value_micros": [value decimalNumberByMultiplyingByPowerOf10:6],
                        @"currency_code": currencyCode,
                        @"precision": precision,
                        @"ad_unit_id": adUnitID,
                        @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                        @"ad_network": adSourceName ?: NSNull.null,
                        @"ad_revenue_format": adFormat
                    }
                },
                AirbridgeAttribute.CURRENCY: currencyCode
            }];
        };
    }];
}

iOS SDK (Previous)

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
import GoogleMobileAds
import AirBridge
import UIKit

class ViewController: UIViewController {
    var rewardedAd: GADRewardedAd? = nil
    
    func requestRewardedAd() {
        let request = GADRequest()
        GADRewardedAd.load(
            withAdUnitID: "ad unit ID",
            request: request
        ) { ad, error in
            if let error {
                print("Rewarded ad failed to load with error: \(error.localizedDescription)")
                return
            }
            
            self.rewardedAd = ad
            self.rewardedAd?.paidEventHandler = { value in
                let (value, currencyCode, precision) = (
                    value.value,
                    value.currencyCode,
                    value.precision
                )
                
                let adUnitID = self.rewardedAd?.adUnitID
                let adNetworkAdapter = self.rewardedAd?.responseInfo?.adNetworkClassName
                let adSourceName = self.rewardedAd?.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName

                // Available adFormat values:
                // "rewarded_video" - for rewarded ads
                // "interstitial" - for interstitial ads
                // "banner" - for banner ads
                // "native" - for native ads
                let adFormat = "rewarded_video"

                let event = ABInAppEvent()
                event?.setCategory("airbridge.adImpression")
                event?.setAction(adUnitID)
                event?.setLabel(adNetworkAdapter)
                event?.setValue(value)
                event?.setSemantics([
                    "adPartners": [
                        "admob": [
                            "value_micros": value * 1000000.0,
                            "currency_code": currencyCode,
                            "precision": precision,
                            "ad_unit_id": adUnitID,
                            "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                            "ad_network": adSourceName ?? NSNull(),
                            "ad_revenue_format": adFormat
                        ]
                    ],
                  	"currency": currencyCode
                ])

                event?.send()
            }
        }
    }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
@import GoogleMobileAds;
@import AirBridge;
@import UIKit;

@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 adValue){
            ViewController* strongSelf = weakSelf;

            // Extract the impression-level ad revenue data.
            NSDecimalNumber* value; = adValue.value;
            NSString* currencyCode = adValue.currencyCode;
            GADAdValuePrecision precision = adValue.precision;

            // Get the ad unit ID.
            NSString* adUnitId = strongSelf.rewardedAd.adUnitID;

            NSString *adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
            GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                    strongSelf.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
            NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;

            // Available adFormat values:
            // "rewarded_video" - for rewarded ads
            // "interstitial" - for interstitial ads
            // "banner" - for banner ads
            // "native" - for native ads
            NSString *adFormat = @"rewarded_video";

            ABInAppEvent* event = [[ABInAppEvent alloc] init];
            [event setCategory:@"airbridge.adImpression"];
            [event setAction:adUnitId];
            [event setLabel:adNetworkAdapter];
            [event setValue:value];
            [event setSemantics:@{
                @"adPartners": @{
                    @"admob": @{
                        @"value_micros": [value decimalNumberByMultiplyingByPowerOf10:6],
                        @"currency_code": currencyCode,
                        @"precision": precision,
                        @"ad_unit_id": adUnitId,
                        @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                        @"ad_network": adSourceName ?: NSNull.null,
                        @"ad_revenue_format": adFormat
                    }
                },
                @"currency": currencyCode
            }];

            [event send];
        };
    }];
}

Flutter SDK (v4)

123456789101112131415161718192021222324252627282930313233343536373839404142434445
RewardedAd.load(
  adUnitId: adUnitId,
  request: const AdRequest(),
  rewardedAdLoadCallback: RewardedAdLoadCallback(
      onAdLoaded: (ad) {
        ad.onPaidEvent = (Ad ad, double valueMicros,
            PrecisionType precision, String currencyCode) {
          var adUnitID = ad.adUnitId;
          var adNetworkAdapter =
              ad.responseInfo?.mediationAdapterClassName ?? "";
          var adSourceName =
              ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? "";

          // Available adFormat values:
          // "rewarded_video" - for rewarded ads
          // "interstitial" - for interstitial ads
          // "banner" - for banner ads
          // "native" - for native ads
          var adFormat = 'rewarded_video';

          Map admob = {
            'value_micros': valueMicros,
            'currency_code': currencyCode,
            'precision': precision.toString(),
            'ad_unit_id': adUnitID,
            'ad_network_adapter': adNetworkAdapter,
            'ad_network': adSourceName,
            'ad_revenue_format': adFormat
          };

          Airbridge.trackEvent(
              category: AirbridgeCategory.AD_IMPRESSION,
              semanticAttributes: {
                AirbridgeAttribute.ACTION: adUnitID,
                AirbridgeAttribute.LABEL: adNetworkAdapter,
                AirbridgeAttribute.VALUE: valueMicros / 1000000.0,
                AirbridgeAttribute.AD_PARTNERS: {
                  'admob': admob
                }
              });
        };
      },
      onAdFailedToLoad: (error) {}
  )
);

Flutter SDK (Previous)

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
RewardedAd.load(
  adUnitId: adUnitId,
  request: const AdRequest(),
  rewardedAdLoadCallback: RewardedAdLoadCallback(
      onAdLoaded: (ad) {
        ad.onPaidEvent = (Ad ad, double valueMicros,
            PrecisionType precision, String currencyCode) {
          var adUnitID = ad.adUnitId;
          var adNetworkAdapter =
              ad.responseInfo?.mediationAdapterClassName ?? "";
          var adSourceName =
              ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? "";

          // Available adFormat values:
          // "rewarded_video" - for rewarded ads
          // "interstitial" - for interstitial ads
          // "banner" - for banner ads
          // "native" - for native ads
          var adFormat = 'rewarded_video';

          Map admob = {
            'value_micros': valueMicros,
            'currency_code': currencyCode,
            'precision': precision.toString(),
            'ad_unit_id': adUnitID,
            'ad_network_adapter': adNetworkAdapter,
            'ad_network': adSourceName,
            'ad_revenue_format': adFormat
          };

          Airbridge.event.trackEvent(
              AirbridgeCategory.AD_IMPRESSION,
              AirbridgeEventOption(
                action: adUnitID,
                label: adNetworkAdapter,
                value: valueMicros / 1000000.0,
                semanticAttributes: {
                    'adPartners': {
                      'admob': admob
                    }
                }
              )
          );
        };
      },
      onAdFailedToLoad: (error) {}
  )
);

Unity SDK (v4)

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
private void RequestRewardedAd()
{
    RewardedAd.LoadAd(adUnitId, new AdRequest.Builder().Build(), (rewardedAd, error) => {
        if (error != null) { return; }

        this.rewardedAd = rewardedAd;
        this.rewardedAd.OnPaidEvent += this.HandleAdPaidEvent;
    }
}

public void HandleAdPaidEvent(object sender, AdValueEventArgs args)
{
    if (adInfo == null) {
        return;
    }

    AdValue adValue = args.AdValue;
    var adUnitId = this.rewardedAd.adUnitId;
    var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
    var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
    var adSourceName = loadedAdapterResponseInfo.AdSourceName;

    // Available adFormat values:
    // "rewarded_video" - for rewarded ads
    // "interstitial" - for interstitial ads
    // "banner" - for banner ads
    // "native" - for native ads
    val adFormat = "rewarded_video";
    
    Airbridge.TrackEvent(
        category: AirbridgeCategory.AD_IMPRESSION,
        semanticAttributes: new Dictionary<string, object>()
        {
            { AirbridgeAttribute.ACTION, adUnitId },
            { AirbridgeAttribute.LABEL, adNetworkAdapter },
            { AirbridgeAttribute.VALUE, adValue.Value / 1000000.0 },
            { AirbridgeAttribute.CURRENCY, adValue.CurrencyCode },
            {
                AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                {
                    {
                        "admob", new Dictionary<string, object>()
                        {
                            { "value_micros", adValue.Value },
                            { "currency_code", adValue.CurrencyCode },
                            { "precision", adValue.Precision },
                            { "ad_unit_id", adUnitId },
                            { "ad_network_adapter", adNetworkAdapter },
                            { "ad_network", adSourceName },
                            { "ad_revenue_format", adFormat }
                        }
                    }
                }
            },
        }
    );
}

Unity SDK (Previous)

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
private void RequestRewardedAd()
{
    RewardedAd.LoadAd(adUnitId, new AdRequest.Builder().Build(), (rewardedAd, error) => {
        if (error != null) { return; }

        this.rewardedAd = rewardedAd;
        this.rewardedAd.OnPaidEvent += this.HandleAdPaidEvent;
    }
}

public void HandleAdPaidEvent(object sender, AdValueEventArgs args)
{
    if (adInfo == null) {
        return;
    }

    AdValue adValue = args.AdValue;
    var adUnitId = this.rewardedAd.adUnitId;
    var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
    var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
    var adSourceName = loadedAdapterResponseInfo.AdSourceName;

    // Available adFormat values:
    // "rewarded_video" - for rewarded ads
    // "interstitial" - for interstitial ads
    // "banner" - for banner ads
    // "native" - for native ads
    val adFormat = "rewarded_video"
  
    AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");

    var admob = new Dictionary<string, object>();
    admob["value_micros"] = adValue.Value;
    admob["currency_code"] = adValue.CurrencyCode;
    admob["precision"] = adValue.Precision;
    admob["ad_unit_id"] = adUnitId;
    admob["ad_network_adapter"] = adNetworkAdapter;
    admob["ad_network"] = adSourceName;
    admob["ad_revenue_format"] = adFormat;
     
    var adPartners = new Dictionary<string, object>();
    adPartners["admob"] = admob;
  
    @event.SetAction(adUnitId);
    @event.SetLabel(adNetworkAdapter);
    @event.SetValue(adValue.Value / 1000000.0);
    @event.AddSemanticAttribute("adPartners", adPartners);
    @event.AddSemanticAttribute("currency", adValue.CurrencyCode);
  
    AirbridgeUnity.TrackEvent(@event);
}

에어브릿지로 광고 클릭 데이터 전송하기

애드몹에서 발생한 광고 클릭 데이터를 에어브릿지로 전송합니다. 광고를 보여질때 광고 클릭 데이터를 에어브릿지 SDK로 전송합니다.

Android SDK (v4)

12345678910111213141516171819202122232425
rewardedAd?.let { ad ->
    val adUnitId = ad.adUnitId
    val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
    val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo

    Airbridge.trackEvent(AirbridgeCategory.AD_CLICK,
        mapOf(
            AirbridgeAttribute.ACTION to adUnitId,
            AirbridgeAttribute.LABEL to adNetworkAdapter
            AirbridgeAttribute.AD_PARTNERS to mapOf(
                "admob" to mapOf(
                    "ad_unit_id" to adUnitId,
                    "ad_network_adapter" to adNetworkAdapter,
                    "ad_network" to loadedAdapterResponseInfo?.adSourceName
                )
            )
        )
    )

    ad.show(activityContext, OnUserEarnedRewardListener { rewardItem ->
        // Handle the reward.
    })
} ?: run {
    // ad wasn't ready yet
}
1234567891011121314151617181920212223242526272829
if (rewardedAd != null) {
    String adUnitId = ad.getAdUnitId();
    String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
    AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
    String adSourceName = loadedAdapterResponseInfo.getAdSourceName();

    Airbridge.trackEvent(AirbridgeCategory.AD_CLICK,
        new HashMap<String, Object>() {{
            put(AirbridgeAttribute.ACTION, adUnitId);
            put(AirbridgeAttribute.LABEL, adNetworkAdapter);
            put(AirbridgeAttribute.AD_PARTNERS, new HashMap<String, Object>() {{
                put("admob", new HashMap<String, Object>() {{
                    put("ad_unit_id", adUnitId);
                    put("ad_network_adapter", adNetworkAdapter);
                    put("ad_network", adSourceName);
                }});
            }});
        }}
    );

    rewardedAd.show(activityContext, new OnUserEarnedRewardListener() {
        @Override
        public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
            // Handle the reward.
        }
    });
} else {
  // ad wasn't ready yet
}

Android SDK (Previous)

123456789101112131415161718192021222324252627
rewardedAd?.let { ad ->
    val adUnitId = ad.adUnitId
    val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
    val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo

    val event = Event("airbridge.adClick")
    val admob = mutableMapOf<String, Any?>()
    admob["ad_unit_id"] = adUnitId
    admob["ad_network_adapter"] = adNetworkAdapter
    admob["ad_network"] = loadedAdapterResponseInfo?.adSourceName

    val adPartners = mapOf("admob" to admob)
    event.action = adUnitId
    event.label = adNetworkAdapter
    event.semanticAttributes = mutableMapOf(
        "adPartners" to adPartners,
        "currency" to currencyCode
    )

    Airbridge.trackEvent(event)

    ad.show(activityContext, OnUserEarnedRewardListener { rewardItem ->
        // Handle the reward.
    })
} ?: run {
    // ad wasn't ready yet
}
1234567891011121314151617181920212223242526272829303132
if (rewardedAd != null) {
    String adUnitId = ad.getAdUnitId();
    String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
    AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
    String adSourceName = loadedAdapterResponseInfo.getAdSourceName();

    Event event = new Event("airbridge.adClick")
    Map<String, Object> admob = new HashMap<>();
    admob.put("ad_unit_id", adUnitId);
    admob.put("ad_network_adapter", adNetworkAdapter);
    admob.put("ad_network", adSourceName);

    Map<String, Object> adPartners = new HashMap<>();
    adPartners.put("admob", admob);
    Map<String, Object> semanticAttributes = new HashMap<>();
    semanticAttributes.put("adPartners", adPartners);

    event.setAction(adUnitId);
    event.setLabel(adNetworkAdapter);
    event.setSemanticAttributes(semanticAttributes);

    Airbridge.trackEvent(event);

    rewardedAd.show(activityContext, new OnUserEarnedRewardListener() {
        @Override
        public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
            // Handle the reward.
        }
    });
} else {
  // ad wasn't ready yet
}

iOS SDK (v4)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
class ViewController: UIViewController {
    
    var rewardedAd: GADRewardedAd?

    func load() {
        let request = GADRequest()
        GADRewardedAd.load(withAdUnitID: "ad unit ID", request: request) { [weak self] ad, error in
            if let error = error {
                print("Failed to load rewarded ad: \(error.localizedDescription)")
                return
            }
            self?.rewardedAd = ad
        }
    }

    func show() {
        guard let rewardedAd = rewardedAd else {
            // Ad wasn't ready
            return
        }

        let adUnitID = rewardedAd?.adUnitID
        let adNetworkAdapter = rewardedAd?.responseInfo?.adNetworkClassName
        let adSourceName = rewardedAd?.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName

        Airbridge.trackEvent(
            category: AirbridgeCategory.AD_CLICK,
            semanticAttributes: [
                AirbridgeAttribute.ACTION: adUnitID,
                AirbridgeAttribute.LABEL: adNetworkAdapter,
                AirbridgeAttribute.AD_PARTNERS: [
                    "admob": [
                        "ad_unit_id": adUnitID,
                        "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                        "ad_network": adSourceName ?? NSNull()
                    ]
                ]
            ]
        )
        
        rewardedAd.present(fromRootViewController: self) {
            let reward = rewardedAd.adReward
            // TODO: Reward the user.
        }
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
@interface ViewController () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADRewardedAd *rewardedAd;
@end

@implementation ViewController

- (void)load {
    GADRequest* request = [GADRequest request];
    [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                            request:request
                  completionHandler:^(GADRewardedAd *ad, NSError *error) {
        self.rewardedAd = ad;
    }];
}

- (void)show {
    if (self.rewardedAd) {
        NSString* adUnitId = self.rewardedAd.adUnitID;
        NSString *adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
        GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                        self.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
        NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
        
        // Send Event
        [Airbridge trackEventWithCategory:AirbridgeCategory.AD_CLICK semanticAttributes:@{
            AirbridgeAttribute.ACTION: adUnitID,
            AirbridgeAttribute.LABEL: adNetworkAdapter,
            AirbridgeAttribute.AD_PARTNERS: @{
                @"admob": @{
                    @"ad_unit_id": adUnitID,
                    @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                    @"ad_network": adSourceName ?: NSNull.null
                }
            }
        }];
        
        [self.rewardedAd presentFromRootViewController:self
            userDidEarnRewardHandler:^{
            GADAdReward *reward = self.rewardedAd.adReward;
            // TODO: Reward the user!
        }];
    } else {
        // Ad wasn't ready
    }
}

@end

iOS SDK (Previous)

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
class ViewController: UIViewController {
    
    var rewardedAd: GADRewardedAd?

    func load() {
        let request = GADRequest()
        GADRewardedAd.load(withAdUnitID: "ad unit ID", request: request) { [weak self] ad, error in
            if let error = error {
                print("Failed to load rewarded ad: \(error.localizedDescription)")
                return
            }
            self?.rewardedAd = ad
        }
    }

    func show() {
        guard let rewardedAd = rewardedAd else {
            // Ad wasn't ready
            return
        }

        let adUnitID = rewardedAd.adUnitID
        let adNetworkAdapter = rewardedAd.responseInfo?.adNetworkClassName
        let adSourceName = rewardedAd.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName

        let event = ABInAppEvent()
        event?.setCategory("airbridge.adClick")
        event?.setAction(adUnitID)
        event?.setLabel(adNetworkAdapter)
        event?.setSemantics([
            "adPartners": [
                "admob": [
                    "ad_unit_id": adUnitId,
                    "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                    "ad_network": adSourceName ?? NSNull()
                ]
            ]
        ])
        
        event?.send()

        rewardedAd.present(fromRootViewController: self) {
            let reward = rewardedAd.adReward
            // TODO: Reward the user.
        }
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
@interface ViewController () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADRewardedAd *rewardedAd;
@end

@implementation ViewController

- (void)load {
    GADRequest* request = [GADRequest request];
    [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                            request:request
                  completionHandler:^(GADRewardedAd *ad, NSError *error) {
        self.rewardedAd = ad;
    }];
}

- (void)show {
    if (self.rewardedAd) {
        NSString* adUnitId = self.rewardedAd.adUnitID;
        NSString *adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
        GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                        self.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
        NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
        
        // Send Event
        ABInAppEvent* event = [[ABInAppEvent alloc] init];
        [event setAction:adUnitId];
        [event setCategory:@"airbridge.adClick"];
        [event setLabel:adNetworkAdapter];
        [event setSemantics:@{
            @"adPartners": @{
                @"admob": @{
                    @"ad_unit_id": adUnitId,
                    @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                    @"ad_network": adSourceName ?: NSNull.null
                }
            },
        }];
        [event send];
        
        [self.rewardedAd presentFromRootViewController:self
            userDidEarnRewardHandler:^{
            GADAdReward *reward = self.rewardedAd.adReward;
            // TODO: Reward the user!
        }];
    } else {
        // Ad wasn't ready
    }
}

@end

Flutter SDK (v4)

12345678910111213141516171819202122232425262728293031323334
RewardedAd.load(
  adUnitId: adUnitId,
  request: const AdRequest(),
  rewardedAdLoadCallback: RewardedAdLoadCallback(
      onAdLoaded: (ad) {
        ad.fullScreenContentCallback = FullScreenContentCallback(
          onAdClicked: (ad) {
            var adUnitID = ad.adUnitId;
            var adNetworkAdapter = ad.responseInfo?.mediationAdapterClassName ?? "";
            var adSourceName = ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? ""; 
            Map admob = {
              'ad_unit_id': adUnitID,
              'ad_network_adapter': adNetworkAdapter,
              'ad_network': adSourceName,
            };

            Airbridge.trackEvent(
              category: AirbridgeCategory.AD_CLICK,
              semanticAttributes: {
                AirbridgeAttribute.ACTION: adUnitID,
                AirbridgeAttribute.LABEL: adNetworkAdapter,
                AirbridgeAttribute.AD_PARTNERS: {
                  'admob': admob
                }
              }
            );
          },
        );
      },
      onAdFailedToLoad: (error) {

      }
   )
);

Flutter SDK (Previous)

123456789101112131415161718192021222324252627282930313233343536
RewardedAd.load(
  adUnitId: adUnitId,
  request: const AdRequest(),
  rewardedAdLoadCallback: RewardedAdLoadCallback(
      onAdLoaded: (ad) {
        ad.fullScreenContentCallback = FullScreenContentCallback(
          onAdClicked: (ad) {
            var adUnitID = ad.adUnitId;
            var adNetworkAdapter = ad.responseInfo?.mediationAdapterClassName ?? "";
            var adSourceName = ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? ""; 
            Map admob = {
              'ad_unit_id': adUnitID,
              'ad_network_adapter': adNetworkAdapter,
              'ad_network': adSourceName,
            };

            Airbridge.event.trackEvent(
              AirbridgeCategory.AD_CLICK,
              AirbridgeEventOption(
                action: adUnitID,
                label: adNetworkAdapter,
                semanticAttributes: {
                    'adPartners': {
                      'admob': admob
                    }
                }
              )
            );
          },
        );
      },
      onAdFailedToLoad: (error) {

      }
   )
);

Unity SDK (v4)

1234567891011121314151617181920212223242526272829303132333435363738
public void Show()
{   
    if (rewardedAd != null && rewardedAd.CanShowAd())
    {
        var adUnitId = this.rewardedAd.adUnitId;
        var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
        var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
        var adSourceName = loadedAdapterResponseInfo.AdSourceName;

        Airbridge.TrackEvent(
            category: AirbridgeCategory.AD_CLICK,
            semanticAttributes: new Dictionary<string, object>()
            {
                { AirbridgeAttribute.ACTION, adUnitId },
                { AirbridgeAttribute.LABEL, adNetworkAdapter },
                { AirbridgeAttribute.CURRENCY, adValue.CurrencyCode },
                {
                    AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                    {
                        {
                            "admob", new Dictionary<string, object>()
                            {
                                { "ad_unit_id", adUnitId },
                                { "ad_network_adapter", adNetworkAdapter },
                                { "ad_network", adSourceName }
                            }
                        }
                    }
                },
            }
        );

        rewardedAd.Show((Reward reward) =>
        {
            // TODO: Reward the user.
        });
    }
}

Unity SDK (Previous)

12345678910111213141516171819202122232425262728293031
public void Show()
{   
    if (rewardedAd != null && rewardedAd.CanShowAd())
    {
        var adUnitId = this.rewardedAd.adUnitId;
        var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
        var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
        var adSourceName = loadedAdapterResponseInfo.AdSourceName;

        AirbridgeEvent @event = new AirbridgeEvent("airbridge.adClick");
        
        var admob = new Dictionary<string, object>();
        admob["ad_unit_id"] = adUnitId;
        admob["ad_network_adapter"] = adNetworkAdapter;
        admob["ad_network"] = adSourceName;

        var adPartners = new Dictionary<string, object>();
        adPartners["admob"] = admob;

        @event.SetAction(adUnitId);
        @event.SetLabel(adNetworkAdapter);
        @event.AddSemanticAttribute("adPartners", adPartners);
    
        AirbridgeUnity.TrackEvent(@event);

        rewardedAd.Show((Reward reward) =>
        {
            // TODO: Reward the user.
        });
    }
}