본문으로 건너뛰기

마이그레이션

이 페이지에서는 기존 네이티브(BZVNativeAdView)를 연동한 상태에서 네이티브 2.0(BZVNativeAd2View)으로 마이그레이션 하는 방법을 안내합니다.

기본 설정

주요 변경 내역

  • 광고 레이아웃에서 BZVNativeAdView 대신 BZVNativeAd2View를 사용합니다.
  • 네이티브 2.0에서는 광고 할당 및 갱신을 SDK 내부에서 자동으로 수행합니다. 따라서 광고 할당을 위한 클래스인 BZVBuzzAdNative, BZVNativeAdRequest를 사용할 필요가 없습니다.
  • BZVNativeAdViewBinder 대신 BZVNativeAd2ViewBinder를 사용합니다.
    • 기존에 BZVBuzzAdNative를 생성할 때 추가하였던 Unit ID는 BZVNativeAd2ViewBinder 생성 과정에서 추가합니다.
    • Swift의 경우 기존과 달리 nested builder class를 사용하여 BZVNativeAd2ViewBinder를 생성하는 방식을 사용할 수 있습니다.

대체 메서드

네이티브네이티브 2.0
BZVBuzzAdNative.loadAd(
with: BZVNativeAdRequest,
onSuccess: (BZVNativeAd) -> Void,
onFailure: (NSError) -> Void)
)
BZVNativeAd2ViewBinder.subscribeEvents(
onRequest: () -> Void,
onNext: (BZVNativeAd2) -> Void,
onError: (NSError) -> Void,
onCompleted: () -> Void
)
BZVNativeAd2ViewBinder.bind()

기존 네이티브 구현 예시

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)
  }
}

bs groupId="ios-lang">

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()를 통해 광고 이벤트를 수신합니다.

기존 네이티브 구현 예시

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를 통해 광고에 대한 정보를 가져올 수 있습니다.
  }
}

bs groupId="ios-lang">

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