> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

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

<Info>
  **알립니다**

  이 기능은 베타 서비스입니다. 문의사항은 에어브릿지 CSM을 통해 전달해 주세요. 담당 CSM이 없는 경우 [문의하기](https://app.airbridge.io/supports)를 통해 전달해 주세요.
</Info>

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

<Note>
  **권장하는 연동 방식**

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

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

## 준비하기

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

<Danger>
  **주의하세요**

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

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

* 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 설치 가이드](https://developers.is.com/ironsource-mobile/android/android-sdk/)
* [아이언소스 iOS SDK 설치 가이드](https://developers.is.com/ironsource-mobile/ios/ios-sdk/)
* [아이언소스 유니티 SDK 설치 가이드](https://developers.is.com/ironsource-mobile/unity/unity-plugin/)

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

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

<AccordionGroup>
  <Accordion title="SDK 연동하기 (Android)">
    #### Android SDK

    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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"
                  )
              )
          }
      }
      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      @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");
                  }}
              );
          }
      }
      ```
    </CodeGroup>

    #### Android SDK (Deprecated)

    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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)
          }
      }
      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      @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);
          }
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="SDK 연동하기 (iOS)">
    #### iOS SDK

    <CodeGroup>
      ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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"
                      ]
                  )
              }
          }
      }
      ```

      ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      #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
      ```
    </CodeGroup>

    #### iOS SDK (Deprecated)

    <CodeGroup>
      ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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()
              }
          }
      }
      ```

      ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      #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
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="SDK 연동하기 (Unity)">
    #### Unity SDK

    <CodeGroup>
      ```c# C# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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" }
                  }
              );
          }
      }
      ```
    </CodeGroup>

    #### Unity SDK (Deprecated)

    <CodeGroup>
      ```c# C# lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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);
          }
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

## 서버 투 서버 연동하기

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

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

* [유니티 레벨플레이 S2S 연동하기 (유저가이드)](/ko/guides/unity-levelplay#서버-투-서버-연동하기)

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/unity-levelplay-mediation-ad-revenue-integration" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/unity-levelplay-mediation-ad-revenue-integration" />
