> For the complete documentation index, see [llms.txt](https://adpopcornssp.gitbook.io/ssp-sdk/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://adpopcornssp.gitbook.io/ssp-sdk/sdk/ios/ios-3.1.0+/undefined-3.md).

# 통합형 네이티브 광고

## 네이티브 광고 인스턴스 생성

아래 코드를 추가하여 네이티브 광고 인스턴스를 생성합니다.

{% tabs %}
{% tab title="Swift" %}

```swift
import APSSPSDK

private var unifiedNativeAd: APSSPUnifiedNativeAd?

override func viewDidLoad() {
    super.viewDidLoad()
    
    unifiedNativeAd = APSSPUnifiedNativeAd(
        appKey: "YOUR_APP_KEY",
        placementId: "YOUR_PLACEMENT_ID",
        rootViewController: self
    )
}
```

{% endtab %}

{% tab title="ObjC" %}

```objc
@import APSSPSDK;

@property (nonatomic, strong) APSSPUnifiedNativeAd *unifiedNativeAd;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.unifiedNativeAd = [[APSSPUnifiedNativeAd alloc] 
        initWithAppKey:@"YOUR_APP_KEY"
        placementId:@"YOUR_PLACEMENT_ID"
        rootViewController:self];
}
```

{% endtab %}
{% endtabs %}

## 네이티브 레이아웃 구성

통합형 네이티브 광고는 하나의 `APSSPMediationViewBinder`만 설정하면 모든 미디에이션 업체의 광고가 동일한 레이아웃에 표시됩니다.

[네이티브 레이아웃 가이드](broken://pages/df8a0f17a60042455ddec7f3d647f54f6b42bbb7)

## 네이티브 광고 옵션 설정

`APSSPNativeAdConfig`는 네이티브 광고의 미디에이션 업체별 고유 설정을 관리할 때 사용됩니다.

단, AdFit의 bizboard 옵션은 bizboard 사용 시, 반드시 true로 설정해 사용해 주세요.

{% tabs %}
{% tab title="Swift" %}

```swift
let config = APSSPNativeAdConfig()

// 공통 — PrivacyIcon
config.privacyIconVisibility = true
config.privacyIconPosition = .topRight
config.privacyIconWidth = 15
config.privacyIconHeight = 15
config.privacyIconMargin = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)
config.privacyIconCornerRadius = 0

// 공통 — Template
config.templateBackgroundColor = UIColor(red: 248/255, green: 248/255, blue: 248/255, alpha: 1)
config.templatePrivacyIconPosition = .bottomLeft
config.templatePrivacyIconCornerRadius = 0
config.templateMainImageCornerRadius = 0
config.templateIconImageCornerRadius = 0
config.templatePrivacyIconLRMargin = 0
config.templatePrivacyIconTBMargin = 0

// NAM 옵션
config.namTimeoutMillis = 30000
config.namAdChoicePosition = .topRight
config.namActivateObservingOnBackground = false
config.namEnableMediaBackgroundBlur = false
// config.namDedupeManager = dedupeManager  // 필요 시 설정

// AdFit 옵션
config.adFitTestMode = false
config.adFitBizBoard = true
config.adFitVideoAutoPlayPolicy = 0  // WIFI_ONLY

unifiedNativeAd?.setConfig(config)
```

{% endtab %}

{% tab title="ObjC" %}

```objc
APSSPNativeAdConfig *config = [[APSSPNativeAdConfig alloc] init];

// 공통 — PrivacyIcon
config.privacyIconVisibility = YES;
config.privacyIconPosition = APSSPPrivacyIconPositionTopRight;
config.privacyIconWidth = 15;
config.privacyIconHeight = 15;
config.privacyIconMargin = UIEdgeInsetsMake(2, 2, 2, 2);
config.privacyIconCornerRadius = 0;

// 공통 — Template
config.templateBackgroundColor = [UIColor colorWithRed:248/255.0 green:248/255.0 blue:248/255.0 alpha:1.0];
config.templatePrivacyIconPosition = APSSPPrivacyIconPositionBottomLeft;
config.templatePrivacyIconCornerRadius = 0;
config.templateMainImageCornerRadius = 0;
config.templateIconImageCornerRadius = 0;
config.templatePrivacyIconLRMargin = 0;
config.templatePrivacyIconTBMargin = 0;

// NAM 옵션
config.namTimeoutMillis = 30000;
config.namAdChoicePosition = APSSPPrivacyIconPositionTopRight;
config.namActivateObservingOnBackground = NO;
config.namEnableMediaBackgroundBlur = NO;
// config.namDedupeManager = dedupeManager;  // 필요 시 설정

// AdFit 옵션
config.adFitTestMode = NO;
config.adFitBizBoard = YES;
config.adFitVideoAutoPlayPolicy = 0;  // WIFI_ONLY

[self.unifiedNativeAd setConfig:config];
```

{% endtab %}
{% endtabs %}

### 3.1 애드팝콘 (일반 광고)

애드팝콘 템플릿 선택 안 할 경우에 적용 가능한 옵션 값입니다.

| 옵션                      | 기본값                   | 설명                  |
| ----------------------- | --------------------- | ------------------- |
| privacyIconVisibility   | true                  | PrivacyIcon 표시 여부   |
| privacyIconPosition     | .topRight             | PrivacyIcon 위치      |
| privacyIconWidth        | 15                    | PrivacyIcon 너비 (pt) |
| privacyIconHeight       | 15                    | PrivacyIcon 높이 (pt) |
| privacyIconMargin       | UIEdgeInsets(2,2,2,2) | PrivacyIcon 마진      |
| privacyIconCornerRadius | 0                     | PrivacyIcon 코너 라운드  |

### 3.2 애드팝콘 (템플릿 광고)

애드팝콘 템플릿 선택 했을때 적용 가능한 옵션 값입니다.

| 옵션                              | 기본값         | 설명                     |
| ------------------------------- | ----------- | ---------------------- |
| templateBackgroundColor         | #F8F8F8     | 템플릿 배경색                |
| templatePrivacyIconPosition     | .bottomLeft | 템플릿 PrivacyIcon 위치     |
| templatePrivacyIconCornerRadius | 0           | 템플릿 PrivacyIcon 코너 라운드 |
| templateMainImageCornerRadius   | 0           | 템플릿 메인 이미지 코너 라운드      |
| templateIconImageCornerRadius   | 0           | 템플릿 아이콘 이미지 코너 라운드     |
| templatePrivacyIconLRMargin     | 0           | 템플릿 PrivacyIcon 좌우 마진  |
| templatePrivacyIconTBMargin     | 0           | 템플릿 PrivacyIcon 상하 마진  |

### 3.3 NAM 전용 옵션

| 옵션                               | 기본값       | 설명              |
| -------------------------------- | --------- | --------------- |
| namTimeoutMillis                 | 60000     | 광고 요청 타임아웃 (ms) |
| namAdChoicePosition              | .topRight | AdChoice 위치     |
| namActivateObservingOnBackground | false     | 백그라운드 관찰 활성화    |
| namEnableMediaBackgroundBlur     | false     | 미디어 배경 블러 활성화   |
| namDedupeManager                 | nil       | 광고 중복 노출 방지 매니저 |

namAdChoicePosition은 아래와 같이 정의됩니다.

* .topLeft : 좌측 상단
* .topRight : 우측 상단
* .bottomLeft : 좌측 하단
* .bottomRight : 우측 하단

### 3.4 AdFit 전용 옵션

| 옵션                       | 기본값   | 설명                |
| ------------------------ | ----- | ----------------- |
| adFitTestMode            | false | 테스트 모드            |
| adFitBizBoard            | false | BizBoard 광고 사용 여부 |
| adFitVideoAutoPlayPolicy | 0     | 비디오 자동 재생 정책      |

adFitVideoAutoPlayPolicy은 아래와 같이 정의됩니다.

* 0 : WIFI\_ONLY
* 1 : ALWAYS
* 2 : NEVER

## 네이티브 광고 요청

네이티브 광고 영역에 광고를 로드 할 경우, `load()` API를 추가하여 광고를 요청합니다.

{% tabs %}
{% tab title="Swift" %}

```swift
unifiedNativeAd?.load()
```

{% endtab %}

{% tab title="ObjC" %}

```objc
[self.unifiedNativeAd load];
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
`load()` 호출에 대한 결과로 광고 수신에 실패한 경우에는 `load()` 재호출을 하시면 안됩니다. 과도한 광고 요청 API 호출은 block 사유가 됩니다.
{% endhint %}

## 네이티브 광고 이벤트 Delegate

네이티브 광고에서 발생하는 이벤트를 받고자 할 경우, delegate를 설정합니다.

| Delegate 메서드                               | 설명                                      |
| ------------------------------------------ | --------------------------------------- |
| unifiedNativeAdLoadSuccess(nativeAd:)      | 네이티브 광고 요청 성공 시                         |
| unifiedNativeAdLoadFail(nativeAd:, error:) | 네이티브 광고 요청 실패 시                         |
| unifiedNativeAdImpression(nativeAd:)       | 네이티브 광고가 화면에 노출되었을 때                    |
| unifiedNativeAdClicked(nativeAd:)          | 네이티브 광고를 클릭 했을 때                        |
| unifiedNativeAdHidden(nativeAd:)           | 네이티브 광고를 닫았을 경우 (NAM 미디에이션 광고일 경우에만 발생) |

{% tabs %}
{% tab title="Swift" %}

```swift
unifiedNativeAd?.delegate = self

// MARK: - APSSPUnifiedNativeAdDelegate
extension ViewController: APSSPUnifiedNativeAdDelegate {
    func unifiedNativeAdLoadSuccess(nativeAd: APSSPUnifiedNativeAd) {
        // 광고 로드 성공
    }
    
    func unifiedNativeAdLoadFail(nativeAd: APSSPUnifiedNativeAd, error: APSSPNetworkError) {
        // 광고 로드 실패
    }
    
    func unifiedNativeAdImpression(nativeAd: APSSPUnifiedNativeAd) {
        // 광고 노출
    }
    
    func unifiedNativeAdClicked(nativeAd: APSSPUnifiedNativeAd) {
        // 광고 클릭
    }
    
    func unifiedNativeAdHidden(nativeAd: APSSPUnifiedNativeAd) {
        // 광고 닫힘 (NAM만)
    }
}
```

{% endtab %}

{% tab title="ObjC" %}

```objc
self.unifiedNativeAd.delegate = self;

// .h 파일에 프로토콜 채택
@interface ViewController () <APSSPUnifiedNativeAdDelegate>
@end

// .m 파일에 delegate 메서드 구현
- (void)unifiedNativeAdLoadSuccessWithNativeAd:(APSSPUnifiedNativeAd *)nativeAd {
    // 광고 로드 성공
}

- (void)unifiedNativeAdLoadFailWithNativeAd:(APSSPUnifiedNativeAd *)nativeAd error:(APSSPNetworkError *)error {
    // 광고 로드 실패
}

- (void)unifiedNativeAdImpressionWithNativeAd:(APSSPUnifiedNativeAd *)nativeAd {
    // 광고 노출
}

- (void)unifiedNativeAdClickedWithNativeAd:(APSSPUnifiedNativeAd *)nativeAd {
    // 광고 클릭
}

- (void)unifiedNativeAdHiddenWithNativeAd:(APSSPUnifiedNativeAd *)nativeAd {
    // 광고 닫힘 (NAM만)
}
```

{% endtab %}
{% endtabs %}

## 네이티브 광고 종료

네이티브 광고 인스턴스를 더 이상 사용하지 않을 경우, `stop()` API를 호출하여 메모리 정리를 진행합니다.

{% tabs %}
{% tab title="Swift" %}

```swift
unifiedNativeAd?.stop()
unifiedNativeAd = nil
```

{% endtab %}

{% tab title="ObjC" %}

```objc
[self.unifiedNativeAd stop];
self.unifiedNativeAd = nil;
```

{% endtab %}
{% endtabs %}
