네이티브 광고는 앱의 UI에 자연스럽게 통합되는 광고 포맷입니다. 광고 요소(제목, 이미지, 설명 등)를 앱 디자인에 맞게 자유롭게 커스터마이징할 수 있습니다.
주요 특징
- 앱 UI와 완벽하게 통합 가능한 커스텀 디자인
- 광고 요소 개별 접근 및 배치
- 광고주 프로필 정보 표시 옵션
- 추가 커스텀 필드 지원
구현 방법
네이티브 광고 구현은 다음 단계로 진행됩니다:
- 광고 로드
- 커스텀 뷰 생성
- 뷰 바인딩
- 델리게이트 처리
1. 광고 로드
AdropNativeAd 인스턴스를 생성하고 광고를 로드합니다.
import AdropAds
class MyViewController: UIViewController {
private var nativeAd: AdropNativeAd?
override func viewDidLoad() {
super.viewDidLoad()
// 네이티브 광고 생성
nativeAd = AdropNativeAd(unitId: "YOUR_NATIVE_UNIT_ID")
nativeAd?.delegate = self
// 광고 로드
nativeAd?.load()
}
}
Context ID 설정
문맥 타겟팅을 위해 Context ID를 설정할 수 있습니다.
nativeAd?.contextId = "article_123"
개발 중에는 테스트 유닛 ID를 사용하세요. 테스트 유닛 ID 섹션을 참고하세요.
2. 커스텀 뷰 생성
스토리보드 또는 코드로 네이티브 광고 뷰를 구성합니다.
UIKit (Storyboard/XIB)
스토리보드에서 AdropNativeAdView를 생성하고 광고 요소를 IBOutlet으로 연결합니다.
import AdropAds
class NativeAdViewCell: UITableViewCell {
@IBOutlet weak var nativeAdView: AdropNativeAdView!
@IBOutlet weak var iconImageView: UIImageView!
@IBOutlet weak var headlineLabel: UILabel!
@IBOutlet weak var bodyLabel: UILabel!
@IBOutlet weak var mediaView: UIView!
@IBOutlet weak var callToActionButton: UIButton!
// 광고주 프로필 (선택사항)
@IBOutlet weak var advertiserLogoImageView: UIImageView!
@IBOutlet weak var advertiserNameLabel: UILabel!
func configure(with ad: AdropNativeAd) {
// 뷰 바인딩 (다음 섹션 참고)
}
}
UIKit (코드)
import AdropAds
class NativeAdView: UIView {
let nativeAdView = AdropNativeAdView()
let iconImageView = UIImageView()
let headlineLabel = UILabel()
let bodyLabel = UILabel()
let mediaView = UIView()
let callToActionButton = UIButton()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
private func setupViews() {
addSubview(nativeAdView)
nativeAdView.addSubview(iconImageView)
nativeAdView.addSubview(headlineLabel)
nativeAdView.addSubview(bodyLabel)
nativeAdView.addSubview(mediaView)
nativeAdView.addSubview(callToActionButton)
// Auto Layout 설정
// ...
}
}
3. 뷰 바인딩
AdropNativeAdView에 광고 요소를 바인딩하여 광고 데이터를 표시합니다.
func configure(with ad: AdropNativeAd) {
// 각 요소를 AdropNativeAdView에 바인딩
nativeAdView.setIconView(iconImageView)
nativeAdView.setHeadLineView(headlineLabel)
nativeAdView.setBodyView(bodyLabel)
nativeAdView.setMediaView(mediaView)
nativeAdView.setCallToActionView(callToActionButton)
// 광고주 프로필 (선택사항)
if let advertiserLogoView = advertiserLogoImageView,
let advertiserNameView = advertiserNameLabel {
nativeAdView.setAdvertiserLogoView(advertiserLogoView)
nativeAdView.setAdvertiserNameView(advertiserNameView)
}
// 광고 데이터 설정 (자동으로 바인딩된 뷰에 표시됨)
nativeAdView.setNativeAd(ad)
}
바인딩 메서드
| 메서드 | 설명 | 필수 |
|---|
setIconView(_:) | 아이콘 이미지 뷰 설정 | 선택 |
setHeadLineView(_:) | 제목 레이블 설정 | 선택 |
setBodyView(_:) | 설명 레이블 설정 | 선택 |
setMediaView(_:) | 메인 이미지/비디오 뷰 설정 | 선택 |
setCallToActionView(_:) | CTA 버튼 설정 | 선택 |
setAdvertiserLogoView(_:) | 광고주 로고 이미지 뷰 설정 | 선택 |
setAdvertiserNameView(_:) | 광고주 이름 레이블 설정 | 선택 |
setNativeAd(_:) | 광고 데이터 설정 | 필수 |
광고주 프로필을 표시하려면 애드컨트롤 콘솔에서 해당 광고 유닛의 광고주 프로필 표시를 활성화해야 합니다.
4. 델리게이트 처리
AdropNativeAdDelegate를 구현하여 광고 이벤트를 처리합니다.
extension MyViewController: AdropNativeAdDelegate {
// 광고 수신 성공
func onAdReceived(_ nativeAd: AdropNativeAd) {
print("네이티브 광고 수신 성공")
// 광고 데이터에 접근
if let headline = nativeAd.headline {
print("제목: \(headline)")
}
if let body = nativeAd.body {
print("설명: \(body)")
}
if let cta = nativeAd.callToAction {
print("CTA: \(cta)")
}
// 뷰에 광고 바인딩
configureNativeAdView(with: nativeAd)
}
// 광고 수신 실패
func onAdFailedToReceive(_ nativeAd: AdropNativeAd, _ errorCode: AdropErrorCode) {
print("네이티브 광고 수신 실패: \(errorCode)")
}
// 광고 클릭 (선택사항)
func onAdClicked(_ nativeAd: AdropNativeAd) {
print("네이티브 광고 클릭")
}
// 광고 노출 (선택사항)
func onAdImpression(_ nativeAd: AdropNativeAd) {
print("네이티브 광고 노출")
}
}
델리게이트 메서드
| 메서드 | 필수 | 설명 |
|---|
onAdReceived(_:) | 필수 | 광고 로드 성공 시 호출 |
onAdFailedToReceive(_:_:) | 필수 | 광고 로드 실패 시 호출 |
onAdClicked(_:) | 선택 | 사용자가 광고를 클릭했을 때 호출 |
onAdImpression(_:) | 선택 | 광고가 노출되었을 때 호출 |
광고 속성
AdropNativeAd 객체를 통해 광고 데이터에 접근할 수 있습니다.
기본 속성
// 광고 수신 성공 시
func onAdReceived(_ nativeAd: AdropNativeAd) {
// 제목
if let headline = nativeAd.headline {
print("제목: \(headline)")
}
// 설명
if let body = nativeAd.body {
print("설명: \(body)")
}
// CTA 버튼 텍스트
if let callToAction = nativeAd.callToAction {
print("CTA: \(callToAction)")
}
// 메인 이미지/비디오
if let asset = nativeAd.asset {
print("미디어 URL: \(asset)")
}
}
광고주 프로필
// 광고주 정보
if let profile = nativeAd.profile {
if let logo = profile.displayLogo {
print("광고주 로고: \(logo)")
}
if let name = profile.displayName {
print("광고주 이름: \(name)")
}
}
커스텀 필드
애드컨트롤 콘솔에서 설정한 추가 텍스트 항목에 접근할 수 있습니다.
// 추가 텍스트 항목
if let extra = nativeAd.extra {
// 예: 가격 정보
if let price = extra["price"] {
print("가격: \(price)")
}
// 예: 할인율
if let discount = extra["discount"] {
print("할인율: \(discount)")
}
// 예: 평점
if let rating = extra["rating"] {
print("평점: \(rating)")
}
}
extra 필드는 애드컨트롤 콘솔의 광고 유닛 설정에서 정의한 추가 텍스트 항목 ID를 키로 사용합니다.
속성 목록
| 속성 | 타입 | 설명 |
|---|
headline | String? | 광고 제목 |
body | String? | 광고 설명 |
callToAction | String? | CTA 버튼 텍스트 |
asset | String? | 메인 이미지/비디오 URL |
profile | AdropProfile? | 광고주 프로필 정보 |
extra | [String: String]? | 추가 커스텀 필드 |
완전한 예제
UITableView에서 네이티브 광고를 표시하는 예제입니다.
import UIKit
import AdropAds
class FeedViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
private var nativeAd: AdropNativeAd?
private var items: [Any] = []
override func viewDidLoad() {
super.viewDidLoad()
// 네이티브 광고 로드
nativeAd = AdropNativeAd(unitId: "YOUR_NATIVE_UNIT_ID")
nativeAd?.delegate = self
nativeAd?.load()
// 일반 콘텐츠 로드
loadContent()
}
private func loadContent() {
// 일반 콘텐츠 로드
items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]
tableView.reloadData()
}
}
extension FeedViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 3번째 위치에 광고 표시
if indexPath.row == 2, let ad = nativeAd {
let cell = tableView.dequeueReusableCell(
withIdentifier: "NativeAdCell",
for: indexPath
) as! NativeAdCell
cell.configure(with: ad)
return cell
}
let cell = tableView.dequeueReusableCell(
withIdentifier: "ContentCell",
for: indexPath
)
cell.textLabel?.text = items[indexPath.row] as? String
return cell
}
}
extension FeedViewController: AdropNativeAdDelegate {
func onAdReceived(_ nativeAd: AdropNativeAd) {
print("네이티브 광고 수신 성공")
tableView.reloadData()
}
func onAdFailedToReceive(_ nativeAd: AdropNativeAd, _ errorCode: AdropErrorCode) {
print("네이티브 광고 수신 실패: \(errorCode)")
}
func onAdClicked(_ nativeAd: AdropNativeAd) {
print("네이티브 광고 클릭")
}
func onAdImpression(_ nativeAd: AdropNativeAd) {
print("네이티브 광고 노출")
}
}
// 네이티브 광고 셀
class NativeAdCell: UITableViewCell {
@IBOutlet weak var nativeAdView: AdropNativeAdView!
@IBOutlet weak var iconImageView: UIImageView!
@IBOutlet weak var headlineLabel: UILabel!
@IBOutlet weak var bodyLabel: UILabel!
@IBOutlet weak var mediaView: UIView!
@IBOutlet weak var callToActionButton: UIButton!
@IBOutlet weak var advertiserLogoImageView: UIImageView!
@IBOutlet weak var advertiserNameLabel: UILabel!
func configure(with ad: AdropNativeAd) {
// 뷰 바인딩
nativeAdView.setIconView(iconImageView)
nativeAdView.setHeadLineView(headlineLabel)
nativeAdView.setBodyView(bodyLabel)
nativeAdView.setMediaView(mediaView)
nativeAdView.setCallToActionView(callToActionButton)
nativeAdView.setAdvertiserLogoView(advertiserLogoImageView)
nativeAdView.setAdvertiserNameView(advertiserNameLabel)
// 광고 설정
nativeAdView.setNativeAd(ad)
// 커스텀 필드 사용 예시
if let extra = ad.extra, let price = extra["price"] {
// 가격 표시 로직
print("가격: \(price)")
}
}
}
테스트 유닛 ID
개발 및 테스트 시 다음 테스트 유닛 ID를 사용하세요.
| 광고 타입 | 테스트 유닛 ID |
|---|
| 네이티브 (이미지) | PUBLIC_TEST_UNIT_ID_NATIVE |
| 네이티브 비디오 (16:9) | PUBLIC_TEST_UNIT_ID_NATIVE_VIDEO_16_9 |
| 네이티브 비디오 (9:16) | PUBLIC_TEST_UNIT_ID_NATIVE_VIDEO_9_16 |
// 테스트 광고 로드
nativeAd = AdropNativeAd(unitId: AdropUnitId.PUBLIC_TEST_UNIT_ID_NATIVE)
실제 배포 시에는 반드시 애드컨트롤 콘솔에서 생성한 실제 유닛 ID를 사용하세요.
관련 문서