Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

Pop 기능을 사용하려면 initialize 을 반드시 Application.onCreate 에서 해야합니다.

BuzzvilSdk 는 기본적으로 Application.onCreate 에서 initialize 하도록 가이드되고 가이드하고 있지만 다음 코드를 앱에 적용하면 원하는 시점에 BuzzvilSdk 를 초기화하여 사용할 수 있습니다.

필요한 시점에 초기화하는 방식은 기본적으로 다음과 같은 형태로 동작합니다.

BuzzvilSdk 기능을 사용하기 전에 Buzzvil SDK 초기화 상태를 확인하여 초기화되지 않았다면 BuzzvilSdk.initialize를 호출하여 초기화 후 사용합니다.

유저 프로필 설정 샘플코드

Code Block
/**
  * 유저 프로필 설정
  * 1. Buzzvil SDK 초기화 상태를 확인하여 초기화되지 않았다면 BuzzvilSdk.initialize를 호출하여 초기화합니다.
  * 2. BuzzvilSdk.setUserProfile을 호출하여 유저 프로필을 설정합니다.
  */
binding.buttonPublisherLogin.setOnClickListener {
    initIfNeeded()
    setUserProfile()
}

베네핏 허브 열기 샘플코드

Code Block
/**
  * 베네핏 허브 열기
  * 1. Buzzvil SDK 초기화 상태를 확인하여 초기화되지 않았다면 BuzzvilSdk.initialize를 호출하여 초기화합니다.
  * 2. BuzzAdFeed를 생성하여 show를 호출하여 허브를 엽니다.
  * 3. try-catch를 사용하여 BuzzAdFeed 를 사용할 수 없는 상태에 대한 Exception을 처리합니다.
  */
binding.buttonPublisherShowHub.setOnClickListener {
    initIfNeeded()
    try {
        Log.d(TAG, "buttonPublisherShowHub - Success. Buzzvil SDK is initialized.")
        val buzzAdFeed = BuzzAdFeed.Builder().build()
        buzzAdFeed.show(this)
    } catch (e: Exception) {
        Log.d(TAG, "buttonPublisherShowHub - Failure. exception: $e")
        e.printStackTrace()
    }
}

setUserProfile()

유저 프로필을 설정합니다.

호출 시점: 앱에서 유저 프로필이 변경될 때 (로그인, 로그아웃 등)

...

Code Block
/**
  * 유저 프로필 설정
  */
private fun setUserProfile() {
    Log.d(TAG, "setUserProfile")
    // Set user profile
    BuzzvilSdk.setUserProfile(
        userId = "test_user_id",
        gender = UserProfile.Gender.MALE,
        birthYear = 1990,
    )
}

initIfNeeded()

Buzzvil SDK가 초기화되지 않았다면 BuzzvilSdk.initialize를 호출하여 초기화합니다.

...

Code Block
/**
  * Buzzvil SDK 초기화
  * Buzzvil SDK가 초기화되지 않았다면 BuzzvilSdk.initialize를 호출하여 초기화합니다.
  */
private fun initIfNeeded() {
    // Initialize Buzzvil SDK
    if (BuzzvilSdk.isInitialized) {
        Log.d(TAG, "initIfNeeded - Buzzvil SDK is already initialized.")
    } else {
        Log.d(TAG, "initIfNeeded - Initialize Buzzvil SDK.")
        val buzzAdBenefitConfig = BuzzAdBenefitConfig.Builder(SAMPLE_BENEFIT_APP_ID)
        val feedConfigBuilder = FeedConfig.Builder(SAMPLE_BENEFIT_FEED_UNIT_ID)
        buzzAdBenefitConfig.setDefaultFeedConfig(feedConfigBuilder.build())

        BuzzvilSdk.initialize(
            application,
            buzzAdBenefitConfig.build()
        )
    }
}

네이티브 광고 로드 및 표시 (NativeAd2)

네이티브 광고를 사용하는 경우 NativeAd2ViewBinder.Builder()를 사용하는 코드를 다음과 같이 변경합니다.

...

Code Block
/**
  * 네이티브 광고 로드 및 표시
  * 1. Buzzvil SDK 초기화 상태를 확인하여 초기화되지 않았다면 BuzzvilSdk.initialize를 호출하여 초기화합니다.
  * 2. 유저 프로필이 설정되어 있지 않다면 광고를 로드하지 않고 리턴합니다.
  * 3. NativeAd2ViewBinder.Builder() 를 통해 광고 레이아웃을 설정합니다.
  * 4. try-catch를 사용하여 NativeAd2ViewBinder 를 사용할 수 없는 상태에 대한 Exception을 처리합니다.
  */
private fun loadNativeAd(nativeAdUnitId: String) {
    initIfNeeded()
    if (!BuzzvilSdk.isUserProfileSet) {
        Log.d(TAG, "User profile is not set")
        return
    }
    // 광고 레이아웃을 설정합니다.
    val binder = try {
        NativeAd2ViewBinder.Builder()
            .nativeAd2View(binding.customNativeAd2View)
            .mediaView(binding.mediaView)
            .titleTextView(binding.textTitle)
            .descriptionTextView(binding.textDescription)
            .iconImageView(binding.imageIcon)
            .ctaView(binding.ctaView)
            .nativeOverlayViewLayout(binding.customNativeOverlayLayout)
            .build(nativeAdUnitId)
    } catch (e: Exception) {
        Log.e(TAG, "Failed to create NativeAd2ViewBinder", e)
        return
    }

    // (Optional) 광고 요청 상태에 따른 UI를 구현합니다.
    binder.addNativeAd2StateChangedListener(object : NativeAd2StateChangedListener {
        override fun onRequested() {
            // 광고 할당을 요청한 상태입니다.
            // 이후에는 onNext(), onComplete(), onError() 중 하나가 호출됩니다.
            // 광고 자동 갱신을 시도할 때마다 반복적으로 호출됩니다.
            // 로딩 화면 등을 구현할 수 있습니다.

            Log.d(TAG, "[state] onRequested 광고 할당 요청 중")
        }

        override fun onNext(nativeAd2: NativeAd2) {
            // 광고 할당에 성공하면 호출됩니다.
            // 이후에 광고 갱신 시 onRequested()가 다시 호출됩니다.
            // 광고 자동 갱신을 성공할 때마다 반복적으로 호출됩니다.
            // 로딩 화면 등을 구현한 경우, 여기에서 로딩을 종료합니다.
            binding.customNativeAd2View.visibility = View.VISIBLE
            binding.nativeToFeedLayout.visibility = View.VISIBLE

            Log.d(TAG, "[state] onNext 광고 할당 성공")
        }

        override fun onComplete() {
            // 더 이상 갱신할 수 있는 광고가 없을 때 호출됩니다.
            // 로딩 화면 등을 구현한 경우, 여기에서 로딩을 종료합니다.
            binding.customNativeAd2View.visibility = View.VISIBLE
            binding.nativeToFeedLayout.visibility = View.VISIBLE

            Log.d(TAG, "[state] onComplete 더 이상 할당 받을 수 있는 광고 없음")
        }

        override fun onError(adError: AdError) {
            // 최초 광고 할당에 실패하면 호출됩니다.
            // 로딩 화면 등을 구현한 경우, 여기에서 로딩을 종료합니다.
            Log.d(TAG, "[state] onError 광고 할당 실패: ${adError.adErrorType.name}")
        }
    })

    // (Optional) 광고 이벤트 리스너를 등록합니다.
    binder.addNativeAd2EventListener(object : NativeAd2EventListener {
        override fun onImpressed(nativeAd2: NativeAd2) {
            // Native 광고가 유저에게 노출되었을 때 호출됩니다.
            Log.d(TAG, "[event] onImpressed")
        }

        override fun onClicked(nativeAd2: NativeAd2) {
            // 유저가 Native 광고를 클릭했을 때 호출됩니다.
            Log.d(TAG, "[event] onClicked")
        }

        override fun onRewardRequested(nativeAd2: NativeAd2) {
            // 리워드 적립을 요청했을 때 호출됩니다.
            Log.d(TAG, "[event] onRewardRequested")
        }

        override fun onParticipated(nativeAd2: NativeAd2) {
            // 유저가 광고 참여를 완료하였을 때 호출됩니다.
            Log.d(TAG, "[event] onParticipated")
        }

        override fun onRewarded(nativeAd2: NativeAd2, rewardResult: RewardResult) {
            // 리워드가 적립되었을 때 호출됩니다.
            Log.d(TAG, "[event] onRewarded. rewardResult: ${rewardResult.name}")
        }
    })
    // 광고 할당 및 표시를 자동으로 수행합니다.
    binder.bind()
}

테스트 코드 첨부

View file
namePublisherMainActivity.kt

...