본문으로 건너뛰기

보상형 광고

보상형 광고는 사용자에게 인센티브를 제공하는 형태의 광고로써 Full screen 내에서 동영상 보기를 완료했을 때 보상을 제공하는 형태의 광고입니다.


시작하기 앞서

  • 광고 호출을 위해 Ad Unit ID가 필요합니다.

    NAM Admin을 통해 광고 공급자 설정, Inventory 설정, 광고 유닛 등록 등의 과정을 마무리하여 주시기 바랍니다.

    관련 내용은 NAM 관리자에게 문의 부탁드립니다.

  • 광고 상위에 다른 View가 있다면 노출 측정이 제대로 되지 않아 성과 지표 측정에 불이익이 있을 수 있습니다.


[Step 1] NAM SDK 적용 완료

공통 통합 내용을 참고해 주세요

이하 내용은 NAM SDK 적용이 완료된 상태를 가정하고 진행합니다.


[Step 2] (샘플을 위한 옵션) 레이아웃 추가

(배너나 네이티브와는 다르게) 보상형 광고를 위해 Ad Container를 만들 필요는 없습니다.

그리고 배너 광고나 네이티브 광고 등은 로드 완료가 되면 광고가 노출되지만, 보상형 광고는 로드 이후 광고를 보여주는 메소드가 별도로 있습니다.

그래서 광고의 load 와 show 각 단계를 구별하기 위해 샘플에서는 show 버튼을 만들어 사용합니다.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RewardedFragment">

<Button
android:id="@+id/show_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="SHOW" />

</androidx.constraintlayout.widget.ConstraintLayout>

[Step 3] 광고 파라미터 생성 및 로드

광고 요청 파라미터의 경우 Ad Unit ID는 필수 값 입니다.

그 외의 값은 선택적이고 광고 요청 정보를 참고해 주시기 바랍니다.

GfpRewardedAdManager 의 instance 를 생성후, loadAd() 메서드를 호출함으로써 보상형 광고를 load할 수 있습니다.

위험

이때 activity context가 필요합니다. 일부 DSP 에서는 activity context를 넘겨주지 않는 경우 오동작 할 수 있습니다.

배너나 네이티브 광고에선 load가 광고 게재(show)와 연결 되지만, 보상형/전면형 광고에서는 loadshow가 분리되어 있습니다.

load 는 광고를 보여주기 위한 준비를 하는 단계입니다.


[Step 4] 광고 이벤트 수신

GfpRewardedAdManager instance 에 아래와 같이 RewardedAdListener 를 설정함으로써 다양한 광고 이벤트를 수신할 수 있습니다.

onAdCompleted 메소드에서 광고 보상 정보를 받을 수 있습니다.

rewardedAdManager.setAdListener(object: RewardedAdListener() {
override fun onAdLoaded(ad: GfpRewardedAd) {
// 광고 로드 성공시
}

override fun onAdStarted(ad: GfpRewardedAd) {
// 광고가 정상적으로 보여지기 시작했을 때
}

override fun onAdClicked(ad: GfpRewardedAd) {
// 광고 클릭 됐을 때
}

override fun onAdClosed(ad: GfpRewardedAd) {
// 광고가 close 됐을 때
}

override fun onAdCompleted(ad: GfpRewardedAd) {
// 광고 정상적으로 완료됐을 때, 리워드 보상이 있을 때
}

override fun onError(ad: GfpRewardedAd, error: GfpError) {
// 광고 로드 실패 또는 렌더링 도중에 에러 발생시
}
})

[Step 5] 광고 로드 및 게재 (Show)

  • GfpRewardedAdManager의 설정이 마무리 되었다면 loadAd() 를 통해 광고를 로드할 수 있습니다.
  • 만약 광고가 성공적으로 로드 됐다면, 광고를 게재할 수 있습니다.
    • 광고를 게재하기 전에 선택적으로 isAdInvalidated() 를 호출함으로써 광고 유효성을 체크할 수 있습니다.

      해당 메서드 결과가 true라면, 해당 광고는 유효하지 않은 상태이므로 광고 제공자에 따라서 광고는 보여지지만

      정상적으로 과금이 발생하지 않는 상황이 발생 할 수 있습니다.

      참고로 DSP 마다 광고의 유효 시간이 있을 수 있는데, DSP 마다 다르지만 로드 이후 시간이 오래 지나면 invalid 한 상태가 될 수도 있습니다.

    • 또한 한번 show 된 광고는 다시 show 되지 않습니다.

class RewardedFragment : Fragment() {
private lateinit var rewardedAdManager: GfpRewardedAdManager
private lateinit var showButton: Button

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_rewarded, container, false)
showButton = view.findViewById(R.id.show_button)
showButton.isEnabled = false

showButton.setOnClickListener {
// 유효성 체크
if (rewardedAdManager.isAdInvalidated()) {
Log.d("MainActivity", "광고가 유효하지 않습니다")
return@setOnClickListener
}

rewardedAdManager.showAd(requireActivity())
}

val adParam: AdParam = AdParam.Builder()
.setAdUnitId("YOUR_AD_UNIT_ID")
.addUserParam("testKey", "testValue")
.build()

rewardedAdManager = GfpRewardedAdManager(requireActivity(), adParam)

// 필요시 타임아웃 셋팅
// rewardedAdManager.setTimeoutMillis(60_000L);

rewardedAdManager.setAdListener(object: RewardedAdListener() {
override fun onAdLoaded(ad: GfpRewardedAd) {
Log.d("RewardedFragment", "로드 완료. responseInfo[${ad.responseInfo}]")
showButton.isEnabled = true
}

override fun onAdStarted(ad: GfpRewardedAd) {
Log.d("RewardedFragment", "시작")
}

override fun onAdClicked(ad: GfpRewardedAd) {
Log.d("RewardedFragment", "클릭")
}

override fun onAdClosed(ad: GfpRewardedAd) {
Log.d("RewardedFragment", "광고 종료")
showButton.isEnabled = false
}

override fun onAdCompleted(ad: GfpRewardedAd) {
Log.d(
"RewardedFragment",
"완료 - 리워드 발생할 수 있음. responseInfo[${ad.responseInfo}]"
)
}

override fun onError(ad: GfpRewardedAd, error: GfpError) {
Log.e("RewardedFragment", ad.responseInfo.toString())
}
})

rewardedAdManager.loadAd()

return view
}
}

[Step 6] 광고 삭제

보상형 광고의 게재가 끝나면 광고가 올바르게 종료 되도록 광고를 삭제해야 합니다.

광고 삭제는 아래와 같이 GfpRewardedAdManager 가 제공하는 destroy() 를 호출하면 됩니다.

override fun onDestroy() {
rewardedAdManager?.let { it.destroy() }
super.onDestroy()
}