리워드 광고

리워드 광고는 사용자가 광고를 시청하면 보상을 받는 인기 있는 전체 화면 광고 형식입니다.

이 광고 유형의 표시는 사용자가 활성화합니다. 예를 들어 게임에서 보너스나 추가 생명을 받기 위해 표시합니다.

사용자 동기가 높아 무료 앱에서 가장 인기 있고 수익성이 높은 광고 형식입니다.

표시 예

이 가이드는 Android 앱에 리워드 광고를 연동하는 방법을 안내합니다. 코드 예시와 설명 외에도 형식별 권장 사항과 추가 자료 링크를 포함합니다.

사전 요구 사항

  1. 빠른 시작에 설명된 SDK 통합 단계를 따릅니다.
  2. 미리 광고 SDK를 초기화합니다.
  3. Yandex Mobile Ads SDK의 최신 버전을 사용 중인지 확인합니다. 미디에이션을 사용하는 경우 통합 빌드도 최신 버전인지 확인합니다.

구현

리워드 광고 연동의 주요 단계:

  • RewardedAdLoader 광고 로더를 생성하고 설정합니다.
  • 광고 로드 콜백 메서드용 리스너를 등록합니다: RewardedAdLoadListener.
  • 광고를 로드합니다.
  • 광고 이벤트 콜백 메서드용 RewardedAdEventListener 리스너를 등록합니다.
  • RewardedAd를 렌더링합니다.
  • 광고 시청에 대해 사용자에게 보상을 지급합니다.

리워드 광고 연동의 특징

  1. Yandex Mobile Ads SDK 메서드 호출은 모두 메인 스레드에서 수행해야 합니다.

  2. onAdFailedToLoad() 콜백에서 오류가 발생하면 바로 새 광고를 다시 로드하지 마세요. 부득이하면 광고 로드 재시도 횟수를 제한하세요. 제한이 걸린 환경에서 반복적인 실패 요청과 연결 문제를 줄이는 데 도움이 됩니다.

  3. 광고와 상호작용하는 화면의 수명 주기 동안 로더와 광고에 대한 강한 참조를 유지하는 것을 권장합니다.

  4. 성능 향상을 위해 모든 광고 로드에 RewardedAdLoader 인스턴스 하나만 사용하는 것을 권장합니다.

광고 로드

리워드 광고를 로드하려면 RewardedAdLoader 객체를 생성하고 설정합니다.

이때 Activity 또는 Application 컨텍스트가 필요합니다.

광고 로드 성공·실패를 알리려면 RewardedAdLoaderRewardedAdLoadListener 콜백 리스너를 설정합니다.

광고를 로드하려면 Yandex Advertising Network 인터페이스에서 받은 광고 단위 ID(adUnitId)가 필요합니다.

AdRequestConfiguration.Builder()로 사용자 관심사, 앱 컨텍스트, 위치 등의 데이터를 넣어 광고 요청 매개변수를 확장할 수 있습니다. 요청에 추가 컨텍스트를 담으면 광고 품질이 크게 향상될 수 있습니다. 자세한 내용은 광고 타기팅을 참고하세요.

광고가 로드되면(onAdLoaded(rewardedAd: RewardedAd) 호출) 표시가 끝나기 전에 로드된 RewardedAd에 대한 참조를 저장하세요.

아래 예시는 Activity에서 리워드 광고를 로드하는 방법을 보여 줍니다.

class RewardedAdActivity : AppCompatActivity(R.layout.activity_rewarded_ad) {
    private var rewardedAd: RewardedAd? = null
    private var rewardedAdLoader: RewardedAdLoader? = null
    private lateinit var binding: ActivityRewardedAdBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityRewardedAdBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Rewarded ads loading should occur after initialization of the SDK.
        // Initialize SDK as early as possible, for example in Application.onCreate or Activity.onCreate
        rewardedAdLoader = RewardedAdLoader(this).apply {
            setAdLoadListener(object : RewardedAdLoadListener {
                override fun onAdLoaded(rewardedAd: RewardedAd) {
                    this.rewardedAd = rewardedAd
                    // The ad was loaded successfully. You can now show the ad.
                }

                override fun onAdFailedToLoad(adRequestError: AdRequestError) {
                    // Ad failed to load with AdRequestError.
                    // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                }
            })
        }
        loadRewardedAd()
    }

    private fun loadRewardedAd() {
        val adRequestConfiguration = AdRequestConfiguration.Builder("your-ad-unit-id").build()
        rewardedAdLoader?.loadAd(adRequestConfiguration)
    }
}
public class RewardedAdActivity extends AppCompatActivity {
    @Nullable
    private RewardedAd mRewardedAd = null;
    @Nullable
    private RewardedAdLoader mRewardedAdLoader = null;
    private ActivityRewardedAdBinding mBinding;

    public RewardedAdActivity() {
        super(R.layout.activity_rewarded_ad);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityRewardedAdBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());

        // Interstitial ads loading should occur after initialization of the SDK.
        // Initialize SDK as early as possible, for example in Application.onCreate or Activity.onCreate
        mRewardedAdLoader = new RewardedAdLoader(this);
        mRewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() {
            @Override
            public void onAdLoaded(@NonNull final RewardedAd rewardedAd) {
                mRewardedAd = rewardedAd;
                // The ad was loaded successfully. You can now show the ad.
            }

            @Override
            public void onAdFailedToLoad(@NonNull final AdRequestError adRequestError) {
                // Ad failed to load with AdRequestError.
                // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
            }
        });
        loadRewardedAd();
    }

    private void loadRewardedAd() {
        if (mRewardedAdLoader != null ) {
            final AdRequestConfiguration adRequestConfiguration =
                new AdRequestConfiguration.Builder("your-ad-unit-id").build();
            mRewardedAdLoader.loadAd(adRequestConfiguration);
        }
    }
}

광고 렌더링

리워드 광고는 사용자가 광고를 시청하면 보상을 받는 인센티브 기반 광고 형식입니다. 보상은 게임에서 추가 생명이나 다음 레벨 진행 등이 될 수 있으며, 보상 형식은 앱 수준에서 정해집니다.

리워드 광고의 수명 주기를 추적하고 보상을 지급하려면 RewardedAd 객체에 RewardedAdEventListener 콜백 리스너를 설정합니다.

광고를 표시하려면 로드된 광고의 show 메서드에 Activity를 넘겨야 합니다.

private fun showAd() {
    rewardedAd?.apply {
        setAdEventListener(object : RewardedAdEventListener {
            override fun onAdShown() {
                // Called when an ad is shown.
            }

            override fun onAdFailedToShow(adError: AdError) {
            	// Called when an RewardedAd failed to show
            }

            override fun onAdDismissed() {
                // Called when an ad is dismissed.
                // Clean resources after Ad dismissed
                rewardedAd?.setAdEventListener(null)
                rewardedAd = null

                // Now you can preload the next rewarded ad.
                loadRewardedAd()
            }

            override fun onAdClicked() {
                // Called when a click is recorded for an ad.
            }

            override fun onAdImpression(impressionData: ImpressionData?) {
                // Called when an impression is recorded for an ad.
            }

            override fun onRewarded(reward: Reward) {
                // Called when the user can be rewarded.
            }
        })
        show(this@Activity)
    }
}
private void showAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(new RewardedAdEventListener() {
            @Override
            public void onAdShown() {
                // Called when an ad is shown.
            }

            @Override
            public void onAdFailedToShow(@NonNull final AdError adError) {
                // Called when an InterstitialAd failed to show.
            }

            @Override
            public void onAdDismissed() {
                // Called when an ad is dismissed.
                // Clean resources after Ad dismissed
                if (mRewardedAd != null) {
                    mRewardedAd.setAdEventListener(null);
                    mRewardedAd = null;
                }

                // Now you can preload the next interstitial ad.
                loadRewardedAd();
            }

            @Override
            public void onAdClicked() {
                // Called when a click is recorded for an ad.
            }

            @Override
            public void onAdImpression(@Nullable final ImpressionData impressionData) {
                // Called when an impression is recorded for an ad.
            }

            @Override
            public void onRewarded(@NonNull final Reward reward) {
                // Called when the user can be rewarded.
            }
        });
        mRewardedAd.show(this);
    }
}

리소스 해제

이미 표시한 광고에 대한 참조는 보관하지 마세요. 표시가 끝난 광고에는 setAdEventListener(null)을 호출합니다. 더 이상 사용하지 않는 로더에는 setAdLoadListener(null)을 호출합니다. 이렇게 하면 리소스가 해제되어 메모리 누수를 방지할 수 있습니다.

override fun onDestroy() {
    super.onDestroy()
    rewardedAdLoader.setAdLoadListener(null)
    rewardedAdLoader = null
    destroyRewardedAd()
}

private fun destroyRewardedAd() {
    rewardedAd?.setAdEventListener(null)
    rewardedAd = null
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mRewardedAdLoader != null) {
        mRewardedAdLoader.setAdLoadListener(null);
        mRewardedAdLoader = null;
    }
    destroyRewardedAd();
}

private void destroyRewardedAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(null);
        mRewardedAd = null;
    }
}

리워드 광고 연동 테스트

광고 테스트를 위한 데모 광고 유닛 사용

리워드 광고 통합과 앱 자체를 테스트하려면 테스트 광고 사용을 권장합니다.

모든 광고 요청에 테스트 광고가 반환되도록 특별한 데모 광고 게재 ID를 만들었습니다. 광고 통합 확인에 사용하세요.

데모 adUnitId: demo-rewarded-yandex.

Важно

스토어에 앱을 게시하기 전에 데모 광고 게재 ID를 Yandex Advertising Network 인터페이스에서 받은 실제 ID로 반드시 바꾸세요.

사용 가능한 데모 광고 게재 ID 목록은 테스트용 데모 광고 유닛 섹션에서 확인할 수 있습니다.

광고 통합 테스트

SDK에 내장된 분석기로 리워드 광고 통합을 테스트할 수 있습니다.

이 도구는 리워드 광고가 올바르게 통합되었는지 검사하고 로그에 자세한 보고서를 출력합니다. 보고서를 보려면 Android 앱 디버깅용 Logcat 도구에서 키워드 YandexAds로 검색하세요.

adb logcat -v brief '*:S YandexAds'

통합이 성공하면 다음 메시지가 표시됩니다.

adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type rewarded was integrated successfully

리워드 광고 통합에 문제가 있으면 문제점과 수정 권장 사항이 담긴 자세한 보고서를 받을 수 있습니다.

추가 자료