유니티 레벨플레이 (아이언소스)

알립니다

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

에어브릿지와 유니티 레벨플레이(아이언소스)를 연동해 광고로 발생한 수익과 관련된 데이터를 에어브릿지 대시보드에서 확인할 수 있습니다. 에어브릿지는 유니티 레벨플레이와의 서버 투 서버(S2S) 연동과 SDK 연동을 지원합니다.

권장하는 연동 방식

더 정확한 광고 성과 측정과 활용을 위해 서버 투 서버 연동과 SDK 연동을 모두 설정하는 것을 권장합니다.

에어브릿지는 SDK 연동으로 실시간으로 받은 데이터를 서버 투 서버 연동으로 받은 보정된 데이터로 자동 업데이트합니다. 또한 SDK 연동으로 받은 데이터는 SKAdNetwork(SKAN)에 활용할 수 있습니다.

준비하기

에어브릿지 SDK가 아래 버전 이상인지 확인해 주세요. 확인 시점에 에어브릿지 SDK가 아래 버전 미만이라면 서버 투 서버 연동 또는 SDK 연동 중에 1가지만 진행하는 것을 권장합니다.

주의하세요

서버 투 서버 연동과 SDK 연동을 모두 진행한다면 에어브릿지 SDK가 아래 버전 이상인지 반드시 확인해 주세요.

충분히 많은 유저가 아래 버전 이상의 SDK가 설치된 앱으로 업데이트한 후에 모든 연동을 진행하는 것을 권장합니다. 아래 버전 미만의 에어브릿지 SDK가 설치된 앱을 사용하는 유저가 대부분일 때 서버 투 서버 연동과 SDK 연동을 모두 진행하면 유저 수가 정확히 집계되지 않습니다.

  • Android SDK 2.25.0

  • iOS SDK 1.37.3

  • React Native SDK 2.8.6

  • Flutter SDK 3.5.6

  • Cordova SDK 2.6.6

  • Expo SDK 2.6.6

  • Unity SDK 1.14.5

  • Unreal SDK 1.3.5

SDK 연동하기

아래 링크에 따라 아이언소스 SDK를 설치해 주세요.

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

유니티 레벨플레이(아이언소스)에서 발생한 광고 수익 데이터를 에어브릿지로 전송합니다. 아이언소스 SDK에 광고 수익 데이터 콜백을 설정합니다. 해당 콜백을 활용하여 광고 수익 데이터를 에어브릿지 SDK로 전송합니다.

Android SDK (v4)

123456789101112131415161718192021222324252627282930313233
override fun onImpressionSuccess(impressionData: ImpressionData) {
    if (impressionData != null) {

        Airbridge.trackEvent(
            AirbridgeCategory.AD_IMPRESSION,
            mapOf(
                AirbridgeAttribute.ACTION to impressionData.adNetwork,
                AirbridgeAttribute.LABEL to impressionData.placement,
                AirbridgeAttribute.VALUE to impressionData.revenue,
                AirbridgeAttribute.AD_PARTNERS to mapOf(
                    // optional fields
                    "ironSource" to mapOf(
                        "auction_id" to impressionData.auctionId,
                        "ad_unit" to impressionData.adUnit,
                        "ad_network" to impressionData.adNetwork,
                        "instance_name" to impressionData.instanceName,
                        "instance_id" to impressionData.instanceId,
                        "country" to impressionData.country,
                        "placement" to impressionData.placement,
                        "revenue" to impressionData.revenue,
                        "precision" to impressionData.precision,
                        "ab" to impressionData.ab,
                        "segment_name" to impressionData.segmentName,
                        "lifetime_revenue" to impressionData.lifetimeRevenue,
                        "encrypted_cpm" to impressionData.encryptedCPM
                    )
                ),
                // ironSource has a default currency of USD
                AirbridgeAttribute.CURRENCY to "USD"
            )
        )
    }
}
12345678910111213141516171819202122232425262728293031323334
@Override
public void onImpressionSuccess(ImpressionData impressionData) {
    if (impressionData != null) {

        Airbridge.trackEvent(
            AirbridgeCategory.AD_IMPRESSION,
            new HashMap() {{
                put(AirbridgeAttribute.ACTION, impressionData.getAdNetwork());
                put(AirbridgeAttribute.LABEL, impressionData.getPlacement());
                put(AirbridgeAttribute.VALUE, impressionData.getRevenue());
                put(AirbridgeAttribute.AD_PARTNERS, new HashMap() {{
                    put("ironSource", new HashMap() {{
                        // optional fields
                        put("auction_id", impressionData.getAuctionId());
                        put("ad_unit", impressionData.getAdUnit());
                        put("ad_network", impressionData.getAdNetwork());
                        put("instance_name", impressionData.getInstanceName());
                        put("instance_id", impressionData.getInstanceId());
                        put("country", impressionData.getCountry());
                        put("placement", impressionData.getPlacement());
                        put("revenue", impressionData.getRevenue());
                        put("precision", impressionData.getPrecision());
                        put("ab", impressionData.getAb());
                        put("segment_name", impressionData.getSegmentName());
                        put("lifetime_revenue", impressionData.getLifetimeRevenue());
                        put("encrypted_cpm", impressionData.getEncryptedCPM());
                    }});
                }});
                // ironSource has a default currency of USD
                put(AirbridgeAttribute.CURRENCY, "USD");
            }}
        );
    }
}

Android SDK (Previous)

1234567891011121314151617181920212223242526272829303132333435
override fun onImpressionSuccess(impressionData: ImpressionData?) {

    if (impressionData != null) {

        val event = Event("airbridge.adImpression")
        val ironSource = mutableMapOf<String, Any?>()

        // optional fields
        ironSource["auction_id"] = impressionData.auctionId
        ironSource["ad_unit"] = impressionData.adUnit
        ironSource["ad_network"] = impressionData.adNetwork
        ironSource["instance_name"] = impressionData.instanceName
        ironSource["instance_id"] = impressionData.instanceId
        ironSource["country"] = impressionData.country
        ironSource["placement"] = impressionData.placement
        ironSource["revenue"] = impressionData.revenue
        ironSource["precision"] = impressionData.precision
        ironSource["ab"] = impressionData.ab
        ironSource["segment_name"] = impressionData.segmentName
        ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue
        ironSource["encrypted_cpm"] = impressionData.encryptedCPM

        val adPartners = mapOf("ironSource" to ironSource)
        event.action = impressionData.adNetwork
        event.label = impressionData.placement
        event.value = impressionData.revenue
        event.semanticAttributes = mutableMapOf(
            "adPartners" to adPartners,
            // ironSource has a default currency of USD
            "currency" to "USD"
        )
        Airbridge.trackEvent(event)
    }
}
1234567891011121314151617181920212223242526272829303132333435363738
@Override
public void onImpressionSuccess(ImpressionData impressionData) {

    if (impressionData != null) {

        Event event = new Event("airbridge.adImpression");
        Map<String, Object> ironSource = new HashMap<>();

        // optional fields
        ironSource.put("auction_id", impressionData.getAuctionId());
        ironSource.put("ad_unit", impressionData.getAdUnit());
        ironSource.put("ad_network", impressionData.getAdNetwork());
        ironSource.put("instance_name", impressionData.getInstanceName());
        ironSource.put("instance_id", impressionData.getInstanceId());
        ironSource.put("country", impressionData.getCountry());
        ironSource.put("placement", impressionData.getPlacement());
        ironSource.put("revenue", impressionData.getRevenue());
        ironSource.put("precision", impressionData.getPrecision());
        ironSource.put("ab", impressionData.getAb());
        ironSource.put("segment_name", impressionData.getSegmentName());
        ironSource.put("lifetime_revenue", impressionData.getLifetimeRevenue());
        ironSource.put("encrypted_cpm", impressionData.getEncryptedCPM());

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

        // ironSource has a default currency of USD
        semanticAttributes.put("currency", "USD");

        event.setAction(impressionData.getAdNetwork());
        event.setLabel(impressionData.getPlacement());
        event.setValue(impressionData.getRevenue());
        event.setSemanticAttributes(semanticAttributes);
        Airbridge.trackEvent(event);
    }
}

iOS SDK (v4)

123456789101112131415161718192021222324252627282930313233343536373839
import AirBridge
import IronSource

class ISImpressionDataManager: NSObject, ISImpressionDataDelegate {
    func impressionDataDidSucceed(_ impressionData: ISImpressionData!) {
        if let impressionData = impressionData {
            var ironSource: [String: Any] = [:]

            Airbridge.trackEvent(
                category: AirbridgeCategory.AD_IMPRESSION,
                semanticAttributes: [
                    AirbridgeAttribute.ACTION: impressionData.ad_network,
                    AirbridgeAttribute.LABEL: impressionData.placement,
                    AirbridgeAttribute.VALUE: impressionData.revenue,
                    AirbridgeAttribute.AD_PARTNERS: [
                        "ironSource": [
                            // optional fields
                            "auction_id": impressionData.auction_id,
                            "ad_unit": impressionData.ad_unit,
                            "ad_network": impressionData.ad_network,
                            "instance_name": impressionData.instance_name,
                            "instance_id": impressionData.instance_id,
                            "country": impressionData.country,
                            "placement": impressionData.placement,
                            "revenue": impressionData.revenue,
                            "precision": impressionData.precision,
                            "ab": impressionData.ab,
                            "segment_name": impressionData.segment_name,
                            "lifetime_revenue": impressionData.lifetime_revenue,
                            "encrypted_cpm": impressionData.encrypted_cpm
                        ]
                    ],
                    // ironSource has a default currency of USD
                    AirbridgeAttribute.CURRENCY: "USD"
                ]
            )
        }
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041
#import "AirBridge.h"
#import "ISImpressionDataManager.h"

@interface ISImpressionDataManager () <ISImpressionDataDelegate>
@end

@implementation ISImpressionDataManager

- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
    if (impressionData) {
        NSMutableDictionary *ironSource = [NSMutableDictionary dictionary];

        [Airbridge trackEventWithCategory:AirbridgeCategory.AD_IMPRESSION semanticAttributes:@{
            AirbridgeAttribute.ACTION: impressionData.ad_network,
            AirbridgeAttribute.LABEL: impressionData.placement,
            AirbridgeAttribute.VALUE: impressionData.revenue,
            AirbridgeAttribute.AD_PARTNERS: @{
                @"ironSource": @{
                    // optional fields
                    @"auction_id": impressionData.auction_id;
                    @"ad_unit": impressionData.ad_unit;
                    @"ad_network": impressionData.ad_network;
                    @"instance_name": impressionData.instance_name;
                    @"instance_id": impressionData.instance_id;
                    @"country": impressionData.country;
                    @"placement": impressionData.placement;
                    @"revenue": impressionData.revenue;
                    @"precision": impressionData.precision;
                    @"ab": impressionData.ab;
                    @"segment_name": impressionData.segment_name;
                    @"lifetime_revenue": impressionData.lifetime_revenue;
                    @"encrypted_cpm": impressionData.encrypted_cpm;
                }
            },
            // ironSource has a default currency of USD
            @"currency": @"USD"
        }];
    }
}

@end

iOS SDK (Previous)

12345678910111213141516171819202122232425262728293031323334353637383940414243
import AirBridge
import IronSource

class ISImpressionDataManager: NSObject, ISImpressionDataDelegate {
    func impressionDataDidSucceed(_ impressionData: ISImpressionData!) {
        if let impressionData = impressionData {
            var ironSource: [String: Any] = [:]

            // optional fields
            ironSource["auction_id"] = impressionData.auction_id
            ironSource["ad_unit"] = impressionData.ad_unit
            ironSource["ad_network"] = impressionData.ad_network
            ironSource["instance_name"] = impressionData.instance_name
            ironSource["instance_id"] = impressionData.instance_id
            ironSource["country"] = impressionData.country
            ironSource["placement"] = impressionData.placement
            ironSource["revenue"] = impressionData.revenue
            ironSource["precision"] = impressionData.precision
            ironSource["ab"] = impressionData.ab
            ironSource["segment_name"] = impressionData.segment_name
            ironSource["lifetime_revenue"] = impressionData.lifetime_revenue
            ironSource["encrypted_cpm"] = impressionData.encrypted_cpm

            var adPartners: [String: Any] = [:]
            adPartners["ironSource"] = ironSource

            var semanticAttributes: [String: Any] = [:]
            semanticAttributes["adPartners"] = adPartners

            // ironSource has a default currency of USD
            semanticAttributes["currency"] = "USD"

            guard let event = ABInAppEvent() else { return }
            event.setCategory("airbridge.adImpression")
            event.setAction(impressionData.ad_network)
            event.setLabel(impressionData.placement)
            event.setValue(impressionData.revenue)
            event.setSemantics(semanticAttributes)

            event.send()
        }
    }
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
#import "AirBridge.h"
#import "ISImpressionDataManager.h"

@interface ISImpressionDataManager () <ISImpressionDataDelegate>
@end

@implementation ISImpressionDataManager

- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
    if (impressionData) {
        NSMutableDictionary *ironSource = [NSMutableDictionary dictionary];

        // optional fields
        ironSource[@"auction_id"] = impressionData.auction_id;
        ironSource[@"ad_unit"] = impressionData.ad_unit;
        ironSource[@"ad_network"] = impressionData.ad_network;
        ironSource[@"instance_name"] = impressionData.instance_name;
        ironSource[@"instance_id"] = impressionData.instance_id;
        ironSource[@"country"] = impressionData.country;
        ironSource[@"placement"] = impressionData.placement;
        ironSource[@"revenue"] = impressionData.revenue;
        ironSource[@"precision"] = impressionData.precision;
        ironSource[@"ab"] = impressionData.ab;
        ironSource[@"segment_name"] = impressionData.segment_name;
        ironSource[@"lifetime_revenue"] = impressionData.lifetime_revenue;
        ironSource[@"encrypted_cpm"] = impressionData.encrypted_cpm;

        NSMutableDictionary *adPartners = [NSMutableDictionary dictionary];
        adPartners[@"ironSource"] = ironSource;

        NSMutableDictionary *semanticAttributes = [NSMutableDictionary dictionary];
        semanticAttributes[@"adPartners"] = adPartners;

        // ironSource has a default currency of USD
        semanticAttributes[@"currency"] = @"USD";

                ABInAppEvent *event = [[ABInAppEvent alloc] init];
                [event setCategory:@"airbridge.adImpression"];
                [event setAction:impressionData.ad_network];
                [event setLabel:impressionData.placement];
                [event setValue:impressionData.revenue];
                [event setSemantics:semanticAttributes];

        [event send];
    }
}

@end

Unity SDK (v4)

12345678910111213141516171819202122232425262728293031323334353637383940414243
IronSourceEvents.onImpressionDataReadyEvent += ImpressionDataReadyEvent;

private void ImpressionDataReadyEvent(IronSourceImpressionData impressionData)
{
    if (impressionData != null)
    {
        Airbridge.TrackEvent(
            category: AirbridgeCategory.AD_IMPRESSION,
            semanticAttributes: new Dictionary<string, object>()
            {
                { AirbridgeAttribute.ACTION, impressionData.adNetwork },
                { AirbridgeAttribute.LABEL, impressionData.placement },
                { AirbridgeAttribute.VALUE, impressionData.revenue ?? 0 },
                {
                    AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                    {
                        {
                            "ironSource", new Dictionary<string, object>()
                            {
                                // optional fields
                                { "auction_id", impressionData.auctionId },
                                { "ad_unit", impressionData.adUnit },
                                { "ad_network", impressionData.adNetwork },
                                { "instance_name", impressionData.instanceName },
                                { "instance_id", impressionData.instanceId },
                                { "country", impressionData.country },
                                { "placement", impressionData.placement },
                                { "revenue", impressionData.revenue },
                                { "precision", impressionData.precision },
                                { "ab", impressionData.ab },
                                { "segment_name", impressionData.segmentName },
                                { "lifetime_revenue", impressionData.lifetimeRevenue },
                                { "encrypted_cpm", impressionData.encryptedCPM }
                            }
                        }
                    }
                },
                // ironSource has a default currency of USD
                { AirbridgeAttribute.CURRENCY, "USD" }
            }
        );
    }
}

Unity SDK (Previous)

123456789101112131415161718192021222324252627282930313233343536373839
IronSourceEvents.onImpressionDataReadyEvent += ImpressionDataReadyEvent;

private void ImpressionDataReadyEvent(IronSourceImpressionData impressionData) 
{
    if (impressionData != null)
    {
        AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");
            
        var ironSource = new Dictionary<string, object>();

        // optional fields
        ironSource["auction_id"] = impressionData.auctionId;
        ironSource["ad_unit"] = impressionData.adUnit;
        ironSource["ad_network"] = impressionData.adNetwork;
        ironSource["instance_name"] = impressionData.instanceName;
        ironSource["instance_id"] = impressionData.instanceId;
        ironSource["country"] = impressionData.country;
        ironSource["placement"] = impressionData.placement;
        ironSource["revenue"] = impressionData.revenue;
        ironSource["precision"] = impressionData.precision;
        ironSource["ab"] = impressionData.ab;
        ironSource["segment_name"] = impressionData.segmentName;
        ironSource["lifetime_revenue"] = impressionData.lifetimeRevenue;
        ironSource["encrypted_cpm"] = impressionData.encryptedCPM;
            
        var adPartners = new Dictionary<string, object>();
        adPartners["ironSource"] = ironSource;
            
        @event.SetAction(impressionData.adNetwork);
        @event.SetLabel(impressionData.placement);
        @event.SetValue(impressionData.revenue ?? 0);
        @event.AddSemanticAttribute("adPartners", adPartners);

        // ironSource has a default currency of USD
        @event.AddSemanticAttribute("currency", "USD");
            
        AirbridgeUnity.TrackEvent(@event);
    }
}

서버 투 서버 연동하기

유니티 레벨플레이(아이언소스)의 서버 투 서버(S2S) 연동에 유니티 레벨플레이의 Secret Key와 Refresh Token이 필요합니다. 유니티 레벨플레이에서 확인한 Secret Key와 Refresh Token을 에어브릿지에 입력합니다.

자세한 연동 방법은 아래 가이드를 참고해 주세요.