본문으로 건너뛰기

네이티브 템플릿 광고

NAM SDK 8.7.0 버전부터는 네이티브 심플 광고 형식을 통해 복잡한 설정 및 추가 작업 없이 네이티브 광고를 적용할 수 있습니다. 이 가이드에서는 네이티브 심플 광고 형식으로 네이티브 광고를 로드 및 게재하는 방식인 네이티브 템플릿 옵션에 대해서 설명합니다.

네이티브 템플릿은 네이티브 광고를 좀 더 빠르게 구현하고 손쉽게 수정할 수 있게 고안된 것으로 네이티브 템플릿을 사용하면 처음 만드는 네이티브 광고도 수 분안에 구현할 수 있고, 많은 코드 없이도 디자인과 스타일을 빠르게 맞춤설정할 수 있습니다.

이 가이드를 효과적으로 적용하려면 네이티브 광고를 구현하는 것에 익숙해야 합니다.


시작하기 앞서

네이티브 심플 광고 가이드를 참고하여 네이티브 심플 광고를 로드 및 게재하는 방법을 알아보세요.


Cocoapods 의존성 추가

NAMSDK Pod과 함께 'NAMSDK/AdRednerer' 모듈 설정을 추가합니다.

'NAMSDK/MediationNDARich' 을 연동하고 있다면, 별도의 기재 없이 AdRenderer 모듈이 추가됩니다.


source 'https://oss.navercorp.com/da-ssp-app-sdk/gfp-sdk-ios-podspec.git' // NAMSDK pods
source 'https://oss.navercorp.com/CocoaPods/Specs.git' // 네이버 공통 pods
source 'https://github.com/CocoaPods/Specs.git'

target 'MyApplication' do
pod 'NAMSDK' # SDK 본체

pod 'NAMSDK/AdRenderer' # 디폴트 템플릿 모듈
end

템플릿 옵션 설정

useNativeTemplate

템플릿에 관련된 옵션은 GFPNativeTemplateOptions 을 통해 제공됩니다. useNativeTemplate은 템플릿 적용 여부를 설정하는 API 입니다.

let nativeSimpleOption = GFPAdNativeSimpleOptions()

let templateOptions = GFPNativeTemplateOptions(useNativeTemplate: true, nativeOptions: nil)
nativeSimpleOption.templateOptions = templateOptions

광고 렌더링 설정

템플릿을 사용했을 때, 렌더링 설정을 바꾸고 싶다면 네이티브/네이티브 심플 모두 설정해야합니다. (설정하지 않을 경우 기본값으로 렌더링)

adInterfaceStyle 설정

아래 샘플 코드는 adInterfaceStyle을 설정하는 방법을 가이드합니다.

let nativeSimpleOption = GFPAdNativeSimpleOptions()

let simpleRenderingSetting = GFPNativeSimpleAdRenderingSetting()
simpleRenderingSetting.adInterfaceStyle = .system //set your style

let options = GFPAdNativeOptions()
let renderingSetting = GFPNativeAdRenderingSetting()
renderingSetting.adInterfaceStyle = .system //set your style
options.renderingSetting = renderingSetting

let templateOptions = GFPNativeTemplateOptions(useNativeTemplate: true, nativeOptions: options)

nativeSimpleOption.templateOptions = templateOptions

그 외

그 외의 설정은 GFPNativeAdRenderingSetting, GFPNativeSimpleAdRenderingSetting 을 통해 변경 할 수 있습니다. 네이티브/네이티브 심플 가이드를 참고해주세요.

디폴트 네이티브 템플릿

위 예시와 같이 기본 값의 GFPNativeTemplateOptions 을 적용할 경우, SDK 에 내장된 기본 템플릿을 통해 아래 이미지와 같이 네이티브 광고를 렌더링하게 됩니다.

image

커스텀 네이티브 템플릿

네이티브 템플릿을 사용하면서 네이티브 광고의 레이아웃을 처음부터 직접 디자인하고 싶다면 아래 예시를 따라주시면 됩니다.

1. 네이티브 템플릿 뷰 정의

광고 뷰를 구성하는 각 에셋 뷰(title, body 등등)를 커스톰 하게 구성합니다.

image

위험

DFP 등 일부 AP의 비디오 뷰 컨트롤 ui 클릭을 위해, 커스톰 템플릿 구성 시 해당 뷰 하위에 MediaView가 위치해야합니다.

1. GFPNativeTemplateViewProtocol conform 하기

커스텀 템플릿용 뷰는 아래 예시와 같이 반드시 GFPNativeTemplateViewProtocol 를 conform 해야 합니다.

extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public static func createView() -> UIView? {
let view = Bundle.main.loadNibNamed("CustomTemplateView", owner: nil)?.first
return view as? UIView
}
}

2. 에셋 뷰 지정 하기

커스텀 템플릿 뷰에 정의 된 에셋에 맞게 지정합니다. 본인이 구성한 커스텀 템플릿 뷰에 존재하는 에셋만 지정하며, 없는 경우 생략하여도 됩니다.

extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public func titleAssetView() -> UILabel? {
/* set your titleLabel */
}

public func bodyAssetView() -> UILabel? {
/* set your bodyLabel */
}

public func advertiseAssetView() -> UILabel? {
/* set your advertiserLabel */
}

public func ctaAssetView() -> UILabel? {
/* set your callToActionLabel */
}

public func adBadgeAssetView() -> UILabel? {
/* set your adBadgeLabel */
}

public func noticeAssetView() -> UILabel? {
/* set your noticeLabel */
}

public func iconContainerView() -> UIImageView? {
/* set your mediaView */
}

public func mediaContainerView() -> GFPMediaView? {
/* set your mediaView */
}

public func adChoicesContainerView() -> UIView? {
/* set your adChoicesContainerView */
}
}

3. bind 를 통해 데이터 맵핑하기

커스텀 템플릿 뷰의 bind 메서드를 오버라이드하여 광고 에셋을 각 View에 바인딩합니다.

extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public func bind(with asset: (any GFPNativeAssetProtocol)?) {
guard let asset = asset else { self.asset = nil; return }

self.asset = asset

self.titleLabel.text = asset.title
self.advertiserLabel.text = asset.advertiser
self.bodyLabel.text = asset.body
self.callToActionLabel.text = asset.callToAction
...
}
}
정보
  • mediaView, iconView, adChoicesView는 별도 맵핑 없이 에셋 지정만 하면 sdk 내부적으로 관리합니다.

4. 예상 높이 전달하기

커스텀 템플릿 뷰의 높이를 전달합니다. 해당 높이는 GFPNativeSimpleAdDelegate의 nativeSimpleAd:didChangeMediaViewSizeWith: 으로 전달됩니다.

extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public func estimateHeight() -> CGFloat {
return /* set your view's height */
}
}

5. (Optional) interfaceStyle 변경에 따른 대응

extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public func changeStyle(with isDarkMode: Bool) {
self.backgroundColor = isDarkMode ? /* set your darkMode's bgColor */ : /* set your lightMode's bgColor */
}
}

6. (Optional) GFPUserInterestDelegate conform 하기

커스톰 뷰에서 GFPUserInterestDelegate 을 conform 합니다. ad:didChangeUserInterest: 는 사용자의 광고 관심도 변화 시점에 호출됩니다.

호출 시점:

  • 관심 시작: 광고 영역의 50% 이상이 1초 동안 노출될 때, userInterest 값이 true 로 전달됨.
  • 관심 종료: 광고 영역이 더 이상 노출되지 않을 때, userInterest 값이 false 로 전달됨.

활용 예시: 사용자가 관심을 보이는 시점에 Call to Action 버튼의 색상을 변경하여 광고 주목도를 높이는 등의 동적 UI 처리가 가능합니다.

extension CustomTemplateView : GFPUserInterestDelegate {
public func ad(_ ad: NSObject!, didChangeUserInterest userInterest: Bool) {
if userInterest {
UIView.animate(withDuration: 0.4) {
if let highlightBgColor = self.asset?.callToActionOption?.highlightBgColor {
self.ctaLabel.backgroundColor = highlightBgColor
} else {
self.ctaLabel.backgroundColor = GFPLabelOption.defaultHighlightBgColor
}
}
} else {
self.ctaLabel.backgroundColor = UIColor.gray
}
}
}

3. 네이티브 템플릿 등록

커스텀 네이티브 템플릿 뷰를 사용하려면 GFPNativeTemplateOptions 에 등록해야 합니다.

다음과 같이 등록합니다:

  • addTemplateWith:templateView: 메서드 사용
  • kGFPTemplateVisualKey.defaultVisualKey 를 비주얼 키로 설정
  • 앞서 생성한 커스텀 네이티브 템플릿 뷰 객체 전달
let templateOptions = GFPNativeTemplateOptions(useNativeTemplate: true, nativeOptions: /* set your nativeOptions */)

let customTemplateView = CustomTemplateView.createView()

if let customTemplateView = customTemplateView as? UIView & GFPNativeTemplateViewProtocol {
templateOptions.addTemplate(with: kGFPTemplateVisualKey.defaultVisualKey, templateView: customTemplateView)
}

4. 광고 요청 및 렌더링

위 과정까지 마쳤다면, 이후의 광고 요청 및 렌더링 그리고 광고 리소스 해제 같은 처리는 기존 네이티브 심플 광고와 사용이 동일합니다.

단, 네이티브 템플릿을 사용할 경우는 네이티브 광고가 네이티브 심플 광고 형식을 통해 처리되므로 GFPAdLoader 를 빌드하는 과정에서 네이티브 광고 로드시 필요한 아래와 같은 처리가 포함되지 말아야 합니다.

네이티브 광고의 옵션 설정이 필요하다면 templateOption 에 전달해야합니다.

let adLoader = GFPAdLoader(unitID: "testUnitId", rootViewController: viewController, adParam: adParam)

// 네이티브 템플릿 사용시 포함되지 말아야 합니다.
let nativeOptions = GFPAdNativeOptions()
adLoader.setNativeDelegate(self, nativeOptions: nativeOptions)

let templateOptions = GFPNativeTemplateOptions(useNativeTemplate: true, nativeOptions: nativeOptions)

let customTemplateView = CustomTemplateView.createView()

if let customTemplateView = customTemplateView as? UIView & GFPNativeTemplateViewProtocol {
templateOptions.addTemplate(with: kGFPTemplateVisualKey.defaultVisualKey, templateView: customTemplateView)
}

let nativeSimpleOptions = GFPAdNativeSimpleOptions()
nativeSimpleOptions.templateOptions = templateOptions

adLoader.setNativeSimpleDelegate(self, nativeSimpleOptions: nativeSimpleOptions)

adLoader.loadAd()