마이그레이션
이 페이지에서는 기존 네이티브(BZVNativeAdView
)를 연동한 상태에서 네이티브 2.0(BZVNativeAd2View
)으로 마이그레이션 하는 방법을 안내합니다.
기본 설정
주요 변경 내역
- 광고 레이아웃에서
BZVNativeAdView
대신BZVNativeAd2View
를 사용합니다. - 네이티브 2.0에서는 광고 할당 및 갱신을 SDK 내부에서 자동으로 수행합니다. 따라서 광고 할당을 위한 클래스인
BZVBuzzAdNative
,BZVNativeAdRequest
를 사용할 필요가 없습니다. BZVNativeAdViewBinder
대신BZVNativeAd2ViewBinder
를 사용합니다.- 기존에
BZVBuzzAdNative
를 생성할 때 추가하였던 Unit ID는BZVNativeAd2ViewBinder
생성 과정에서 추가합니다. - Swift의 경우 기존과 달리 nested builder class를 사용하여
BZVNativeAd2ViewBinder
를 생성하는 방식을 사용할 수 있습니다.
- 기존에
대체 메서드
네이티브 | 네이티브 2.0 |
---|---|
|
|
기존 네이티브 구현 예시
- Swift
- Objective-C
import UIKit
import BuzzAdBenefit
final class ViewController: UIViewController {
// BZVNativeAdView 대신 BZVNativeAd2View를 사용합니다.
private let nativeAdView = BZVNativeAdView(frame: .zero)
// BZVMedaiView, BZVCtaView 등 다른 컴포넌트는 그대로 사용할 수 있습니다.
private let mediaView = BZVMediaView(frame: .zero)
private let iconImageView = UIImageView(frame: .zero)
private let titleLabel = UILabel(frame: .zero)
private let descriptionLabel = UILabel(frame: .zero)
private let ctaView = BZVDefaultCtaView(frame: .zero)
// BZVNativeAdViewBinder 대신 BZVNativeAd2ViewBinder를 사용합니다.
private lazy var viewBinder = BZVNativeAdViewBinder { builder in
// Swift의 경우 nested builder class를 사용할 수 있습니다.
// Builder의 생성 과정에서 Unit ID를 추가합니다.
builder.nativeAdView = self.nativeAdView
builder.mediaView = self.mediaView
builder.iconImageView = self.iconImageView
builder.titleLabel = self.titleLabel
builder.descriptionLabel = self.descriptionLabel
builder.ctaView = self.ctaView
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(nativeAdView)
nativeAdView.addSubview(mediaView)
nativeAdView.addSubview(iconImageView)
nativeAdView.addSubview(titleLabel)
nativeAdView.addSubview(descriptionLabel)
nativeAdView.addSubview(ctaView)
// AutoLayout Constraints 설정
// ...
// BZVNativeAdRequest, BZVBuzzAdNative를 삭제합니다.
let nativeAdRequest = BZVNativeAdRequest()
let buzzAdNative = BZVBuzzAdNative(unitId: "YOUR_NATIVE_UNIT_ID")
buzzAdNative.loadAd(with: nativeAdRequest) { nativeAd in
// BZVNativeAd2ViewBinder.subscribeEvents(onNext:)로 작업을 옮깁니다.
self.renderAd(nativeAd)
} onFailure: { error in
// BZVNativeAd2ViewBinder.bind(onError:)로 작업을 옮깁니다.
print("Failed to load a native ad")
}
}
// renderAd 함수를 제거합니다.
func renderAd(_ ad: BZVNativeAd) {
viewBinder.bind(with: ad)
}
}
@import BuzzAdBenefit;
@interface ViewController ()
// BZVNativeAdView 대신 BZVNativeAd2View를 사용합니다.
@property (nonatomic, strong, readonly) BZVNativeAdView *nativeAdView;
// BZVMedaiView, BZVCtaView 등 다른 컴포넌트는 그대로 사용할 수 있습니다.
@property (nonatomic, strong, readonly) BZVMediaView *mediaView;
@property (nonatomic, strong, readonly) UIImageView *iconImageView;
@property (nonatomic, strong, readonly) UILabel *titleLabel;
@property (nonatomic, strong, readonly) UILabel *descriptionLabel;
@property (nonatomic, strong, readonly) BZVDefaultCtaView *ctaView;
// BZVNativeAdViewBinder 대신 BZVNativeAd2ViewBinder를 사용합니다.
@property (nonatomic, strong, readonly) BZVNativeAdViewBinder *viewBinder;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_nativeAdView = [[BZVNativeAdView alloc] initWithFrame:CGRectZero];
[self.view addSubview:_nativeAdView];
_mediaView = [[BZVMediaView alloc] initWithFrame:CGRectZero];
[_nativeAdView addSubview:_mediaView];
_iconImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
[_nativeAdView addSubview:_iconImageView];
_titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[_nativeAdView addSubview:_titleLabel];
_descriptionLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[_nativeAdView addSubview:_descriptionLabel];
_ctaView = [[BZVDefaultCtaView alloc] initWithFrame:CGRectZero];
[_nativeAdView addSubview:_ctaView];
_viewBinder = [BZVNativeAdViewBinder viewBinderWithBlock:^(BZVNativeAdViewBinderBuilder * _Nonnull builder) {
// Builder에 Unit ID를 설정합니다.
builder.nativeAdView = self.nativeAdView;
builder.mediaView = self.mediaView;
builder.iconImageView = self.iconImageView;
builder.titleLabel = self.titleLabel;
builder.descriptionLabel = self.descriptionLabel;
builder.ctaView = self.ctaView;
}];
// AutoLayout Constraints 설정
// ...
// BZVNativeAdRequest, BZVBuzzAdNative를 삭제합니다.
BZVNativeAdRequest *adRequest = [[BZVNativeAdRequest alloc] init];
BZVBuzzAdNative *buzzAdNative = [BZVBuzzAdNative nativeWithUnitId:@"YOUR_NATIVE_UNIT_ID"];
[buzzAdNative loadAdWithAdRequest:adRequest onSuccess:^(BZVNativeAd * _Nonnull nativeAd) {
// BZVNativeAd2ViewBinder.subscribeEvents(onNext:)로 작업을 옮깁니다.
[self renderAd:nativeAd];
} onFailure:^(NSError * _Nonnull error) {
// BZVNativeAd2ViewBinder.bind(onError:)로 작업을 옮깁니다.
NSLog(@"Failed to load a native ad");
}];
}
// renderAd 함수를 제거합니다.
- (void)renderAd:(BZVNativeAd *)ad {
[_viewBinder bindWithNativeAd:ad];
}
@end
네이티브 2.0 구현 예시
- Swift
- Objective-C
import UIKit
import BuzzAdBenefit
final class ViewController: UIViewController {
// BZVNativeAdView 대신 BZVNativeAd2View를 사용합니다.
private let nativeAd2View = BZVNativeAd2View(frame: .zero)
// BZVMedaiView, BZVCtaView 등 다른 컴포넌트는 그대로 사용할 수 있습니다.
private let mediaView = BZVMediaView(frame: .zero)
private let iconImageView = UIImageView(frame: .zero)
private let titleLabel = UILabel(frame: .zero)
private let descriptionLabel = UILabel(frame: .zero)
private let ctaView = BZVDefaultCtaView(frame: .zero)
// BZVNativeAdViewBinder 대신 BZVNativeAd2ViewBinder를 사용합니다.
private lazy var viewBinder = BZVNativeAd2ViewBinder
// Swift의 경우 nested builder class를 사용할 수 있습니다.
// Builder의 생성 과정에서 Unit ID를 추가합니다.
.Builder(unitId: "YOUR_NATIVE_UNIT_ID")
.nativeAd2View(nativeAd2View)
.mediaView(mediaView)
.iconImageView(iconImageView)
.titleLabel(titleLabel)
.descriptionLabel(descriptionLabel)
.ctaView(ctaView)
.build()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(nativeAd2View)
nativeAd2View.addSubview(mediaView)
nativeAd2View.addSubview(iconImageView)
nativeAd2View.addSubview(titleLabel)
nativeAd2View.addSubview(descriptionLabel)
nativeAd2View.addSubview(ctaView)
// AutoLayout Constraints 설정
// ...
// BZVNativeAdRequest, BZVBuzzAdNative를 삭제합니다.
viewBinder.subscribeEvents(onNext: { [weak self] nativeAd2 in
// BZVNativeAd2ViewBinder.subscribeEvents(onNext:)로 작업을 옮깁니다.
}, onError: { [weak self] error in
// BZVNativeAd2ViewBinder.bind(onError:)로 작업을 옮깁니다.
})
viewBinder.bind()
}
}
@import BuzzAdBenefit;
@interface ViewController ()
// BZVNativeAdView 대신 BZVNativeAd2View를 사용합니다.
@property (nonatomic, strong, readonly) BZVNativeAd2View *nativeAd2View;
// BZVMedaiView, BZVCtaView 등 다른 컴포넌트는 그대로 사용할 수 있습니다.
@property (nonatomic, strong, readonly) BZVMediaView *mediaView;
@property (nonatomic, strong, readonly) UIImageView *iconImageView;
@property (nonatomic, strong, readonly) UILabel *titleLabel;
@property (nonatomic, strong, readonly) UILabel *descriptionLabel;
@property (nonatomic, strong, readonly) BZVDefaultCtaView *ctaView;
// BZVNativeAdViewBinder 대신 BZVNativeAd2ViewBinder를 사용합니다.
@property (nonatomic, strong, readonly) BZVNativeAd2ViewBinder *viewBinder;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_nativeAd2View = [[BZVNativeAd2View alloc] initWithFrame:CGRectZero];
[self.view addSubview:_nativeAd2View];
_mediaView = [[BZVMediaView alloc] initWithFrame:CGRectZero];
[_nativeAd2View addSubview:_mediaView];
_iconImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
[_nativeAd2View addSubview:_iconImageView];
_titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[_nativeAd2View addSubview:_titleLabel];
_descriptionLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[_nativeAd2View addSubview:_descriptionLabel];
_ctaView = [[BZVDefaultCtaView alloc] initWithFrame:CGRectZero];
[_nativeAd2View addSubview:_ctaView];
_viewBinder = [BZVNativeAd2ViewBinder viewBinderWithBlock:^(BZVNativeAd2ViewBinderBuilder * _Nonnull builder) {
// Builder에 Unit ID를 설정합니다.
builder.unitId = @"YOUR_NATIVE_UNIT_ID";
builder.nativeAd2View = self.nativeAd2View;
builder.mediaView = self.mediaView;
builder.iconImageView = self.iconImageView;
builder.titleLabel = self.titleLabel;
builder.descriptionLabel = self.descriptionLabel;
builder.ctaView = self.ctaView;
}];
// AutoLayout Constraints 설정
// ...
// BZVNativeAdRequest, BZVBuzzAdNative를 삭제합니다.
__weak typeof(self) weakSelf = self;
[_viewBinder subscribeEventsOnRequest:^{} onNext:^(BZVNativeAd2 * _Nonnull nativeAd2) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd2ViewBinder.subscribeEvents(onNext:)로 작업을 옮깁니다.
} onError:^(NSError * _Nonnull error) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd2ViewBinder.bind(onError:)로 작업을 옮깁니다.
} onCompleted:^{}];
[_viewBinder bind];
}
@end
고급 설정
주요 변경사항
BZVNativeAd
대신BZVNativeAd2
를 매개 변수로 받아서 광고 정보를 가져옵니다.BZVNativeAdEventDelegate
대신BZVNativeAd2ViewBinder.subscribeAdEvents()
를 통해 광고 이벤트를 수신합니다.
기존 네이티브 구현 예시
- Swift
- Objective-C
final class ViewController: UIViewController {
// ...생략...
private func renderAd(_ ad: BZVNativeAd) {
viewBinder.bind(with: ad)
// bind() 함수 이전에 subscribeAdEvents() 함수를 호출합니다.
// BZVNativeAd 대신 NativeAd2ViewBinder에서 subscribeAdEvents() 함수를 호출합니다.
ad.delegate = self
}
}
// Delegate을 채택하는 방식 대신, subscribeAdEvents()에서 closure를 통해 이벤트를 수신합니다.
extension ViewController: BZVNativeAdEventDelegate {
func didImpress(_ nativeAd: BZVNativeAd) {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
func didClick(_ nativeAd: BZVNativeAd) {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
func didRequestReward(for nativeAd: BZVNativeAd) {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
func didReward(for nativeAd: BZVNativeAd, with result: BZVRewardResult) {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
func didParticipateAd(_ nativeAd: BZVNativeAd) {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
}
@interface ViewController () <BZVNativeAdEventDelegate>
@end
@implementation ViewController
- (void)renderAd:(BZVNativeAd *)ad {
[_viewBinder bindWithNativeAd:ad];
// bind() 함수 이전에 subscribeAdEvents() 함수를 호출합니다.
// BZVNativeAd 대신 NativeAd2ViewBinder에서 subscribeAdEvents() 함수를 호출합니다.
ad.delegate = self;
}
// Delegate을 채택하는 방식 대신, subscribeAdEvents()에서 closure를 통해 이벤트를 수신합니다.
#pragma mark - BZVNativeAdEventDelegate
- (void)didImpressAd:(BZVNativeAd *)nativeAd {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
- (void)didClickAd:(BZVNativeAd *)nativeAd {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
- (void)didRequestRewardForAd:(BZVNativeAd *)nativeAd {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
- (void)didRewardForAd:(BZVNativeAd *)nativeAd withResult:(BZVRewardResult)result {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
- (void)didParticipateAd:(BZVNativeAd *)nativeAd {
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}
@end
네이티브 2.0 구현 예시
- Swift
- Objective-C
final class ViewController: UIViewController {
// ...생략...
override func viewDidLoad() {
// BZVNativeAd 대신 NativeAd2ViewBinder에서 subscribeAdEvents() 함수를 호출합니다.
// Delegate을 채택하는 방식 대신, subscribeAdEvents()에서 closure를 통해 이벤트를 수신합니다.
// 로그 기록, 단순 알림 외에 다른 동작을 추가하는 것을 권장하지 않습니다. 직접 구현한 동작이 네이티브에서 제공하는 기능(광고 자동 갱신 등)과 충돌할 수 있습니다.
viewBinder.subscribeAdEvents(onImpressed: { [weak self] nativeAd2 in
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}, onClicked: { [weak self] nativeAd2 in
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}, onRewardRequested: { [weak self] nativeAd2 in
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}, onRewarded: { [weak self] nativeAd2, rewardResult in
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}, onParticipated: { [weak self] nativeAd2 in
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
})
// bind() 함수 이전에 subscribeAdEvents() 함수를 호출합니다.
viewBinder.bind()
}
}
@implementation ViewController
- (void)viewDidLoad {
// ...생략...
// BZVNativeAd 대신 NativeAd2ViewBinder에서 subscribeAdEvents() 함수를 호출합니다.
// Delegate을 채택하는 방식 대신, subscribeAdEvents()에서 closure를 통해 이벤트를 수신합니다.
// 로그 기록, 단순 알림 외에 다른 동작을 추가하는 것을 권장하지 않습니다. 직접 구현한 동작이 네이티브에서 제공하는 기능(광고 자동 갱신 등)과 충돌할 수 있습니다.
__weak typeof(self) weakSelf = self;
[_viewBinder subscribeAdEventsOnImpressed:^(BZVNativeAd2 * _Nonnull nativeAd2) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
} onClicked:^(BZVNativeAd2 * _Nonnull nativeAd2) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
} onRewardRequested:^(BZVNativeAd2 * _Nonnull nativeAd2) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
} onRewarded:^(BZVNativeAd2 * _Nonnull nativeAd2, BZVRewardResult rewardResult) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
} onParticipated:^(BZVNativeAd2 * _Nonnull nativeAd2) {
__strong typeof(self) strongSelf = weakSelf;
// BZVNativeAd 대신 BZVNativeAd2를 통해 광고에 대한 정보를 가져올 수 있습니다.
}];
// bind() 함수 이전에 subscribeAdEvents() 함수를 호출합니다.
[_viewBinder bind];
}
@end