# Banner Ad

## 1. 기본 요건

* [<mark style="color:blue;">ADX iOS SDK</mark>](/adx/ios/integrate.md#adxlibrary-cocoapods)를 프로젝트에 추가합니다.
* Banner Ad용으로 발급받은 Ad Unit ID를 사용합니다.
* 광고를 요청하기 전에 [<mark style="color:blue;">SDK 초기화</mark>](https://platform-business.gitbook.io/adx/ios/sdk-integration/ad-formats/pages/O5ozkJcMAyY6hEZgu6km#1.-initialize-and-gdpr-content-ui)를 먼저 진행합니다.
  * **SDK 초기화는 앱 실행 시 한 번만 호출**하여 주시고, **광고 요청은 초기화가 완료된 후**에 이뤄져야 합니다.
  * iOS 14 이상 지원하는 경우, [<mark style="color:blue;">ATT(App Tracking Transparency)</mark>](/adx/ios/supporting-ios-14/app-tracking-transparency.md) 권한 요청 완료 후 광고를 요청해주세요.

## 2. 구현

1. `initWithAdUnitId:adSize:rootViewController:` 메서드를 사용하여 `ADXAdView`를 인스턴스화하고 `ADXAdViewDelegate` callback을 등록합니다.

   | ADXAdSize                  | Size (width \* height) |
   | -------------------------- | ---------------------- |
   | `ADXAdSizeBanner`          | 320 \* 50              |
   | `ADXAdSizeLargeBanner`     | 320 \* 100             |
   | `ADXAdSizeMediumRectangle` | 320 \* 250             |
   | `ADXAdSizeLeaderboard`     | 728 \* 90              |
2. `bannerView`의 frame을 설정하고 `ViewController`에 `bannerView`를 추가합니다.
3. `loadAd`를 호출하여 광고를 로드합니다.

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
#import <ADXLibrary/ADXAdView.h>

@interface BannerViewController () <ADXAdViewDelegate>

@property (strong) ADXAdView *bannerView;

@end

@implementation BannerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.bannerView = [[ADXAdView alloc] 
        initWithAdUnitId:@"<ADX_BANNER_AD_UNIT_ID>"
        adSize:ADXAdSizeBanner
        rootViewController:self];

    self.bannerView.delegate = self;
    
    self.bannerView.frame = CGRectMake(
        (self.view.bounds.size.width - ADXAdSizeBanner.width) / 2,
        0,
        ADXAdSizeBanner.width,
        ADXAdSizeBanner.height);
    
    [self.view addSubview:self.bannerView];
    
    [self.bannerView loadAd];
}

#pragma mark - ADXAdViewDelegate

- (void)adViewDidLoad:(ADXAdView *)adView {
    NSLog(@"adViewDidLoad");
}

- (void)adView:(ADXAdView *)adView didFailToLoadWithError:(NSError *)error {
    NSLog(@"adView:didFailToLoadWithError: %@", error);
    
}
- (void)adViewDidClick:(ADXAdView *)adView {
    NSLog(@"adViewDidClick");
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import UIKit
import ADXLibrary

class BannerViewController: UIViewController {
    
    var bannerView : ADXAdView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        bannerView = ADXAdView(
            adUnitId: "<ADX_BANNER_AD_UNIT_ID>", 
            adSize: ADXAdSizeBanner, 
            rootViewController: self)

        bannerView.delegate = self
        
        bannerView.frame = CGRect(
            x: (UIScreen.main.bounds.size.width - ADXAdSizeBanner.width) / 2,
            y: 0,
            width: ADXAdSizeBanner.width,
            height: ADXAdSizeBanner.height)
            
        view.addSubview(bannerView)
        
        bannerView.loadAd()
    }
}

extension BannerViewController: ADXAdViewDelegate {
    
    func adViewDidLoad(_ adView: ADXAdView) {
        print("adViewDidLoad");
    }
    
    func adView(_ adView: ADXAdView, didFailToLoadWithError error: Error) {
        print("adView:didFailToLoadWithError")
    }
    
    func adViewDidClick(_ adView: ADXAdView) {
        print("adViewDidClick")
    }
}

```

{% endtab %}
{% endtabs %}

## 3. Callback

`ADXAdViewDelegate`를 설정하여 특정 이벤트를 수신할 수 있습니다.

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
- (void)adViewDidLoad:(ADXAdView *)adView;
- (void)adView:(ADXAdView *)adView didFailToLoadWithError:(NSError *)error;
- (void)adViewDidClick:(ADXAdView *)adView;
```

{% endtab %}

{% tab title="Swift" %}

```swift
func adViewDidLoad(_ adView: ADXAdView)
func adView(_ adView: ADXAdView, didFailToLoadWithError error: Error)
func adViewDidClick(_ adView: ADXAdView)
```

{% endtab %}
{% endtabs %}

## 4. Ad Revenue (paidEventHandler)

광고 노출에 대한 예상 광고 수익을 확인할 수 있습니다.

{% hint style="info" %}

* 아래 예제와 같이' `paidEventHandler`' 를 사용하여 예상되는 eCPM 값을 확인할 수 있습니다.
* 미디에이션 설정 과정에서 수동적으로 설정한 값과 정확한 값이 섞여 있어서 **예상 값으로 사용**하시는 것을 권장드립니다.
* eCPM의 통화(Currency) 단위는 USD입니다.
* 광고 매출 데이터를 MMP와 연동할 수 있습니다. 자세한 사항은 아래 SDK 연동 가이드를 참조해 주십시오.
  * [애드저스트(Adjust)의 AD(X) SDK 연동 가이드](https://dev.adjust.com/ko/sdk/ios/integrations/adx)
  * [에어브릿지(Airbridge)의 AD(X) SDK 연동 가이드](https://help.airbridge.io/ko/developers/ad-x-ad-revenue-integration#sdk-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-ios)
    {% endhint %}

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
#import <UIKit/UIKit.h>
#import <ADXLibrary/ADXAdView.h>
#import <FirebaseAnalytics/FirebaseAnalytics.h>
#import <AppsFlyerAdRevenue/AppsFlyerAdRevenue.h>

@interface BannerViewController () <ADXAdViewDelegate>
@property (strong) ADXAdView * bannerView;
@end

@implementation BannerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.bannerView = [[ADXAdView alloc] 
        initWithAdUnitId:@"<ADX_BANNER_AD_UNIT_ID>"
        adSize:ADXAdSizeBanner
        rootViewController:self];
                        
    self.bannerView.delegate = self;    
    
    __weak typeof(self) weakSelf = self;
    self.bannerView.paidEventHandler = ^(double eCPM) {
        __strong typeof(self) strongSelf = weakSelf;
        if(!strongSelf) { return; }
        NSNumber * revenue = [NSNumber numberWithDouble:eCPM/1000];
        [strongSelf handleAdRevenue:revenue];
    };
}

- (void)handleAdRevenue:(NSNumber *)revenue {
    // 1) Firebase Analytics
    [FIRAnalytics logEventWithName:kFIREventAdImpression
                        parameters: @{
        kFIRParameterAdPlatform: @"AD(X)",
        kFIRParameterAdFormat: @"BannerAd",
        kFIRParameterAdUnitName: @"ADX Banner Ad",
        kFIRParameterCurrency: @"USD",
        kFIRParameterValue: revenune
    }];
    
    // 2) AppsFlyer
    NSDictionary * adRevenueParams = @{
        @"AdUnitName" : @"ADX Banner Ad",
        @"AdType" : @"BannerAd",
    };
    
    AppsFlyerAdRevenue * appsFlyerAdRevenue = [AppsFlyerAdRevenue shared];
    [appsFlyerAdRevenue 
        logAdRevenueWithMonetizationNetwork:@"AD(X)"
        mediationNetwork:AppsFlyerAdRevenueMediationNetworkTypeCustom
        eventRevenue:revenune
        revenueCurrency:@"USD"
        additionalParameters:adRevenueParams];
}

#pragma mark - ADXAdViewDelegate
- (void)adViewDidLoad:(ADXAdView *)adView {}
- (void)adView:(ADXAdView *)adView didFailToLoadWithError:(NSError *)error {}
- (void)adViewDidClick:(ADXAdView *)adView {}

@end
```

{% endtab %}

{% tab title="Swift" %}

```swift
import UIKit
import ADXLibrary
import FirebaseAnalytics
import AppsFlyerAdRevenue

class BannerAdViewController: UIViewController {

    var bannerView : ADXAdView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        bannerView = ADXAdView(adUnitId: "<ADX_BANNER_AD_UNIT_ID>")
        bannerView.delegate = self
        bannerView.paidEventHandler = { [weak self] eCPM in
            let revenue:NSNumber = (eCPM / 1000) as NSNumber
            self?.handleAdRevenue(revenue: revenue)
        }
    }
    
    func handleAdRevenue(revenue:NSNumber) {
        // 1) Firebase Analytics
        Analytics.logEvent(
            AnalyticsEventAdImpression,
            parameters: [
                AnalyticsParameterAdPlatform: "AD(X)",
                AnalyticsParameterAdUnitName: "ADX Banner Ad",
                AnalyticsParameterAdFormat: "BannerAd",
                AnalyticsParameterValue: revenune,
                AnalyticsParameterCurrency: "USD",
            ])
        
        // 2) AppsFlyer
        let adRevenueParams:[AnyHashable: Any] = [
            "AdUnitName" : "ADX Banner Ad",
            "AdType" : "BannerAd",
        ]
        
        AppsFlyerAdRevenue.shared().logAdRevenue(
            monetizationNetwork: "AD(X)",
            mediationNetwork: .custom,
            eventRevenue: revenune,
            revenueCurrency: "USD",
            additionalParameters: adRevenueParams)
    }
}

extension BannerViewController: ADXAdViewDelegate {
    func adViewDidLoad(_ adView: ADXAdView) {}
    func adView(_ adView: ADXAdView, didFailToLoadWithError error: Error) {}
    func adViewDidClick(_ adView: ADXAdView) {}
}
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://platform-business.gitbook.io/adx/ios/sdk-integration/ad-formats/banner-ad.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
