네이티브 템플릿 광고
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 입니다.
- Swift
- Objective-C
let nativeSimpleOption = GFPAdNativeSimpleOptions()
let templateOptions = GFPNativeTemplateOptions(useNativeTemplate: true, nativeOptions: nil)
nativeSimpleOption.templateOptions = templateOptions
GFPNativeTemplateOptions *templateOption = [[GFPNativeTemplateOptions alloc] initWithUseNativeTemplate:true nativeOptions:nil];
GFPAdNativeSimpleOptions *nativeSimpleOptions = [[GFPAdNativeSimpleOptions alloc] init];
nativeSimpleOptions.templateOptions = templateOption;
광고 렌더링 설정
템플릿을 사용했을 때, 렌더링 설정을 바꾸고 싶다면 네이티브/네이티브 심플 모두 설정해야합니다. (설정하지 않을 경우 기본값으로 렌더링)
adInterfaceStyle 설정
아래 샘플 코드는 adInterfaceStyle을 설정하는 방법을 가이드합니다.
- Swift
- Objective-C
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
GFPAdNativeSimpleOptions *nativeSimpleOptions = [[GFPAdNativeSimpleOptions alloc] init];
GFPNativeSimpleAdRenderingSetting *simpleRenderingSetting = [[GFPNativeSimpleAdRenderingSetting alloc] init];
simpleRenderingSetting.adInterfaceStyle = GFPAdInterfaceStyleSystem; //set your style
GFPAdNativeOptions *options = [[GFPAdNativeOptions alloc] init];
GFPNativeAdRenderingSetting *renderingSetting = [[GFPNativeAdRenderingSetting alloc] init];
renderingSetting.adInterfaceStyle = GFPAdInterfaceStyleSystem; //set your style
options.renderingSetting = renderingSetting;
GFPNativeTemplateOptions *templateOption = [[GFPNativeTemplateOptions alloc] initWithUseNativeTemplate:true nativeOptions:nil];
nativeSimpleOptions.templateOptions = templateOption;
그 외
그 외의 설정은 GFPNativeAdRenderingSetting, GFPNativeSimpleAdRenderingSetting 을 통해 변경 할 수 있습니다. 네이티브/네이티브 심플 가이드를 참고해주세요.
디폴트 네이티브 템플릿
위 예시와 같이 기본 값의 GFPNativeTemplateOptions 을 적용할 경우, SDK 에 내장된 기본 템플릿을 통해 아래 이미지와 같이 네이티브 광고를 렌더링하게 됩니다.
커스텀 네이티브 템플릿
네이티브 템플릿을 사용하면서 네이티브 광고의 레이아웃을 처음부터 직접 디자인하고 싶다면 아래 예시를 따라주시면 됩니다.
1. 네이티브 템플릿 뷰 정의
광고 뷰를 구성하는 각 에셋 뷰(title, body 등등)를 커스톰 하게 구성합니다.
DFP 등 일부 AP의 비디오 뷰 컨트롤 ui 클릭을 위해, 커스톰 템플릿 구성 시 해당 뷰 하위에 MediaView가 위치해야합니다.
1. GFPNativeTemplateViewProtocol conform 하기
커스텀 템플릿용 뷰는 아래 예시와 같이 반드시 GFPNativeTemplateViewProtocol 를 conform 해야 합니다.
- Swift
extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public static func createView() -> UIView? {
let view = Bundle.main.loadNibNamed("CustomTemplateView", owner: nil)?.first
return view as? UIView
}
}
2. 에셋 뷰 지정 하기
커스텀 템플릿 뷰에 정의 된 에셋에 맞게 지정합니다. 본인이 구성한 커스텀 템플릿 뷰에 존재하는 에셋만 지정하며, 없는 경우 생략하여도 됩니다.
- Swift
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에 바인딩합니다.
- Swift
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: 으로 전달됩니다.
- Swift
extension CustomTemplateView: GFPNativeTemplateViewProtocol {
public func estimateHeight() -> CGFloat {
return /* set your view's height */
}
}
5. (Optional) interfaceStyle 변경에 따른 대응
- Swift
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 처리가 가능합니다.
- Swift
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
를 비주얼 키로 설정- 앞서 생성한 커스텀 네이티브 템플릿 뷰 객체 전달
- Swift
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)
}