보상형 광고
보상형 광고는 사용자에게 인센티브를 제공하는 형태의 광고로써 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
)와 연결 되지만, 보상형/전면형 광고에서는 load
와 show
가 분리되어 있습니다.
load
는 광고를 보여주기 위한 준비를 하는 단계입니다.
[Step 4] 광고 이벤트 수신
GfpRewardedAdManager
instance 에 아래와 같이 RewardedAdListener
를 설정함으로써 다양한 광고 이벤트를 수신할 수 있습니다.
onAdCompleted
메소드에서 광고 보상 정보를 받을 수 있습니다.
- Kotlin
- Java
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) {
// 광고 로드 실패 또는 렌더링 도중에 에러 발생시
}
})
rewardedAdManager.setAdListener(new RewardedAdListener() {
@Override
public void onAdLoaded(GfpRewardedAd ad) {
// 광고 로드 성공시
}
@Override
public void onAdStarted(GfpRewardedAd ad) {
// 광고가 정상적으로 보여지기 시작했을 때
}
@Override
public void onAdClicked(GfpRewardedAd ad) {
// 광고 클릭 됐을 때
}
@Override
public void onAdClosed(GfpRewardedAd ad) {
// 광고가 close 됐을 때
}
@Override
public void onAdCompleted(GfpRewardedAd ad) {
// 광고 정상적으로 완료됐을 때, 리워드 보상이 있을 때
}
@Override
public void onError(GfpRewardedAd ad, GfpError error) {
// 광고 로드 실패 또는 렌더링 도중에 에러 발생시
}
});
[Step 5] 광고 로드 및 게재 (Show)
GfpRewardedAdManager
의 설정이 마무리 되었다면loadAd()
를 통해 광고를 로드할 수 있습니다.- 만약 광고가 성공적으로 로드 됐다면, 광고를 게재할 수 있습니다.
-
광고를 게재하기 전에 선택적으로
isAdInvalidated()
를 호출함으로써 광고 유효성을 체크할 수 있습니다.해당 메서드 결과가 true라면, 해당 광고는 유효하지 않은 상태이므로 광고 제공자에 따라서 광고는 보여지지만
정상적으로 과금이 발생하지 않는 상황이 발생 할 수 있습니다.
참고로 DSP 마다 광고의 유효 시간이 있을 수 있는데, DSP 마다 다르지만 로드 이후 시간이 오래 지나면 invalid 한 상태가 될 수도 있습니다.
-
또한 한번
show
된 광고는 다시show
되지 않습니다.
-
- Kotlin
- Java
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
}
}
public class RewardedFragment extends Fragment {
private GfpRewardedAdManager rewardedAdManager;
private Button showButton;
@Override
protected View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_rewarded, container, false);
showButton = view.findViewById(R.id.show_button);
showButton.setEnabled(false);
showButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 유효성 체크
if (rewardedAdManager.isAdInvalidated()) {
Log.d("MainActivity", "광고가 유효하지 않습니다");
return;
}
rewardedAdManager.showAd(requireActivity());
}
});
AdParam adParam = new AdParam.Builder()
.setAdUnitId("YOUR_AD_UNIT_ID")
.addUserParam("testKey", "testValue")
.build();
rewardedAdManager = new GfpRewardedAdManager(requireActivity(), adParam);
// 필요시 타임아웃 셋팅
// rewardedAdManager.setTimeoutMillis(60_000L);
rewardedAdManager.setAdListener(new RewardedAdListener() {
@Override
public void onAdLoaded(GfpRewardedAd ad) {
Log.d("RewardedFragment", String.format("로드 완료. responseInfo[%s]",ad.getResponseInfo().toString()));
showButton.setEnabled(true);
}
@Override
public void onAdStarted(GfpRewardedAd ad) {
Log.d("RewardedFragment", "시작");
}
@Override
public void onAdClicked(GfpRewardedAd ad) {
Log.d("RewardedFragment", "클릭");
}
@Override
public void onAdClosed(GfpRewardedAd ad) {
Log.d("RewardedFragment", "광고 종료");
showButton.setEnabled(false);
}
@Override
public void onAdCompleted(GfpRewardedAd ad) {
Log.d("RewardedFragment", String.format("완료 - 리워드 발생할 수 있음. responseInfo[%s]",ad.getResponseInfo().toString()));
}
@Override
public void onError(GfpRewardedAd ad, GfpError error) {
Log.e("RewardedFragment", ad.getResponseInfo().toString());
}
});
rewardedAdManager.loadAd();
return view;
}
}
[Step 6] 광고 삭제
보상형 광고의 게재가 끝나면 광고가 올바르게 종료 되도록 광고를 삭제해야 합니다.
광고 삭제는 아래와 같이 GfpRewardedAdManager
가 제공하는 destroy()
를 호출하면 됩니다.
- Kotlin
- Java
override fun onDestroy() {
rewardedAdManager?.let { it.destroy() }
super.onDestroy()
}
@Override
public void onDestroy() {
if (rewardedAdManager != null) {
rewardedAdManager.destroy();
}
super.onDestroy();
}