보상형 광고 설정

보상형 광고 를 사용하면 동영상 광고, 플레이어블 광고, 설문조사와 상호작용하는 사용자에게 인앱 상품을 리워드로 제공할 수 있습니다.

이 가이드에서는 보상형 광고를 Android 앱에 통합하는 방법을 설명합니다.

시작하기 전에

계속하기 전에 다음 작업을 실행하세요.

  • 설정 GMA Next-Gen SDK.
  • 테스트 보상형 광고 단위 ID ca-app-pub-3940256099942544/5224354917을 사용합니다.
    • 앱을 빌드하고 테스트할 때는 운영 중인 실제 광고 대신 테스트 광고를 사용하세요. 테스트 광고 단위 ID를 사용하지 않으면 Google에서 계정을 정지할 수 있습니다.
    • 앱을 게시하기 전에 이 ID를 광고 단위 ID로 바꿔야 합니다.
    • GMA Next-Gen SDK 테스트 광고에 관한 자세한 내용은 테스트 광고 사용 설정을 참고하세요.

광고 사전 로드 이해하기 (베타)

GMA Next-Gen SDK의 광고 사전 로드는 광고 로드 및 캐싱을 자동화합니다.

광고 사전 로드는 다음과 같은 이점을 제공합니다.

  • 참조 관리: 광고가 표시될 때까지 참조를 유지합니다.
  • 자동 새로고침: 캐시에서 광고가 검색되면 새 광고를 로드합니다.
  • 관리되는 재시도: 광고를 로드하지 못하면 새 광고를 로드합니다.
  • 만료 처리: 만료되기 전에 광고를 새로고침합니다.
  • 캐시 최적화: 캐시 순서를 최적화하여 우선순위가 가장 높은 광고를 게재합니다.

광고 사전 로드 시작

광고 미리 로드를 시작하려면 start 메서드를 한 번 호출합니다. GMA Next-Gen SDK을 초기화할 때 start 메서드를 호출하면 GMA Next-Gen SDK 자동으로 광고를 미리 로드하고 미리 로드된 구성에 대해 실패한 요청을 재시도합니다.

다음 예에서는 광고 미리 로드를 시작하는 방법을 보여줍니다.

Kotlin

val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedAdPreloader.start(adUnitId, preloadConfig)

자바

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedAdPreloader.start(adUnitId, preloadConfig);

AD_UNIT_ID를 광고 단위 ID로 바꿉니다.

이전 예에서는 광고 단위 ID를 미리 로드 ID로 사용하는 방법을 보여줍니다. 미리 로드 ID는 광고 사전 로드 구성을 식별하기 위해 만드는 문자열 식별자입니다. 앱에 동일한 광고 단위 ID에 대한 여러 타겟팅 구성이 필요한 경우 맞춤 문자열 식별자를 전달합니다.

광고 사전 로드는 타겟팅 매개변수 또는 광고 요청 변경을 지원하지 않습니다. 요청 간에 타겟팅 매개변수를 변경해야 하는 경우 단일 로드를 사용합니다.

미리 로드된 광고 가져오기 및 표시

광고를 표시하기 전에 pollAd 메서드를 호출합니다. 미리 로드된 광고 객체를 저장하지 마세요. `pollAd` 메서드를 호출하면 pollAd GMA Next-Gen SDK 사용 가능한 광고를 가져오고 백그라운드에서 다음 광고를 자동으로 미리 로드합니다. 사용 가능한 광고가 없으면 GMA Next-Gen SDK는 광고를 반환하지 않습니다.

사용 가능한 광고 객체가 있으면 show 메서드를 호출하여 광고를 표시합니다. 리워드 리스너를 사용하여 보상 이벤트를 처리합니다. 다음 예에서는 미리 로드된 광고를 가져오고 표시하는 방법을 보여줍니다.

Kotlin

private fun pollAndShowAd(activity: Activity, adUnitId: String) {
  // Polling returns the next available ad and loads another ad in the background.
  val ad = RewardedAdPreloader.pollAd(adUnitId)
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not available.")
    return
  }

  // Interact with the ad object as needed.
  Log.d(TAG, "Rewarded ad response info: ${ad.getResponseInfo()}")
  ad.adEventCallback =
    object : RewardedAdEventCallback {
      override fun onAdImpression() {
        Log.d(TAG, "Rewarded ad recorded an impression.")
      }
    }
  ad.show(activity) { rewardItem -> Log.d(TAG, "User earned reward: ${rewardItem.amount}") }
}

자바

private void pollAndShowAd(Activity activity, String adUnitId) {
  // Polling returns the next available ad and loads another ad in the background.
  final RewardedAd ad = RewardedAdPreloader.pollAd(adUnitId);

  // Interact with the ad object as needed.
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not available.");
    return;
  }

  Log.d(TAG, "Rewarded ad response info: " + ad.getResponseInfo());
  ad.setAdEventCallback(
      new RewardedAdEventCallback() {
        @Override
        public void onAdImpression() {
          Log.d(TAG, "Rewarded ad recorded an impression.");
        }
      });

  // Show the ad.
  ad.show(
      activity,
      rewardItem -> {
        Log.d(TAG, "User earned reward: " + rewardItem.getAmount());
      });
}

앱이 광고 게재위치에 도달하고 show 메서드를 호출할 수 있으면 pollAd 메서드를 호출합니다. 광고를 보관하기 위해 미리 로드 콜백에서 또는 isAdAvailable 메서드를 확인한 후에 pollAd 메서드를 호출하지 마세요. 광고를 표시하기 전에 광고 메타데이터를 검사해야 하는 경우 캐시에서 광고를 삭제하지 않고 응답 정보를 읽습니다.

광고 이벤트 수신 대기

광고를 표시하기 전에 광고 이벤트를 수신 대기합니다. 다음 예에서는 광고 이벤트의 콜백을 등록합니다.

Kotlin

private fun listenToAdEvents() {
  // Listen for ad events.
  val ad = rewardedAd
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not ready yet.")
    return
  }

  ad.adEventCallback =
    object : RewardedAdEventCallback {
      override fun onAdShowedFullScreenContent() {
        // Rewarded ad did show.
      }

      override fun onAdDismissedFullScreenContent() {
        // Rewarded ad did dismiss.
        rewardedAd = null
      }

      override fun onAdFailedToShowFullScreenContent(
        fullScreenContentError: FullScreenContentError
      ) {
        // Rewarded ad failed to show.
        Log.e(TAG, "Rewarded ad failed to show: ${fullScreenContentError.message}")
      }

      override fun onAdImpression() {
        // Rewarded ad did record an impression.
      }

      override fun onAdClicked() {
        // Rewarded ad did record a click.
      }
    }
}

자바

private void listenToAdEvents() {
  // Listen for ad events.
  if (rewardedAd == null) {
    Log.e(TAG, "Rewarded ad is not ready yet.");
    return;
  }

  rewardedAd.setAdEventCallback(
      new RewardedAdEventCallback() {
        @Override
        public void onAdShowedFullScreenContent() {
          // Rewarded ad did show.
        }

        @Override
        public void onAdDismissedFullScreenContent() {
          // Rewarded ad did dismiss.
          rewardedAd = null;
        }

        @Override
        public void onAdFailedToShowFullScreenContent(
            FullScreenContentError fullScreenContentError) {
          // Rewarded ad failed to show.
          Log.e(TAG, "Rewarded ad failed to show: " + fullScreenContentError.getMessage());
        }

        @Override
        public void onAdImpression() {
          // Rewarded ad did record an impression.
        }

        @Override
        public void onAdClicked() {
          // Rewarded ad did record a click.
        }
      });
}

선택사항: 서버 측 확인 (SSV) 콜백 검사

서버 측 확인 (SSV) 콜백에서 사용자 및 애플리케이션 컨텍스트를 전달하려면 광고를 표시하기 전에 광고 객체에 확인 옵션을 설정합니다. SSV 콜백은 세션 상태 없이 Google에서 서버로 도착하므로 다음 선택적 문자열을 연결합니다. Google은 이러한 문자열을 변경하지 않고 SSV 콜백에서 서명된 쿼리 매개변수로 전달합니다.

  • user_id 쿼리 매개변수: 크레딧을 제공할 사용자(예: 내부 계정 ID)를 식별합니다.
  • custom_data 쿼리 매개변수: 리워드 게재위치, 게임 레벨 또는 서버에서 생성된 nonce와 같은 앱 데이터를 전달합니다.

값을 설정하지 않으면 Google은 SSV 콜백에서 해당 쿼리 매개변수를 생략합니다.

다음 예에서는 광고를 표시하기 전에 광고 객체에 맞춤 데이터를 설정합니다.

Kotlin

RewardedAd.load(
  context,
  AD_UNIT_ID,
  AdRequest.Builder().build(),
  object : RewardedAdLoadCallback() {
    override fun onAdLoaded(ad: RewardedAd) {
      rewardedAd = ad
      val options =
        ServerSideVerificationOptions.Builder().setCustomData("SAMPLE_CUSTOM_DATA_STRING").build()
      rewardedAd?.setServerSideVerificationOptions(options)
    }
  },
)

자바

RewardedAd.load(
    context,
    AD_UNIT_ID,
    new AdRequest.Builder().build(),
    new RewardedAdLoadCallback() {
      @Override
      public void onAdLoaded(RewardedAd ad) {
        rewardedAd = ad;
        ServerSideVerificationOptions options =
            new ServerSideVerificationOptions.Builder()
                .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
                .build();
        rewardedAd.setServerSideVerificationOptions(options);
      }
    });

SAMPLE_CUSTOM_DATA_STRING을 맞춤 데이터로 바꿉니다.

핵심사항: custom_data 쿼리 매개변수는 퍼센트 인코딩됩니다. 값을 파싱하기 전에 서버에서 문자열을 URL 디코딩하고 user_id 또는 custom_data 쿼리 매개변수를 신뢰하기 전에 콜백 서명을 확인합니다.

선택사항: 미리 로드 이벤트 수신 대기

광고 미리 로드를 시작할 때 미리 로드 이벤트를 등록하여 광고가 미리 로드되거나, 미리 로드에 실패하거나, 광고 캐시가 소진될 때 알림을 받습니다.

다음 예에서는 광고 미리 로드 이벤트를 등록하는 방법을 보여줍니다.

Kotlin

val preloadCallback =
  object : PreloadCallback {
    override fun onAdFailedToPreload(preloadId: String, adError: LoadAdError) {
      Log.d(TAG, "Rewarded preload ad $preloadId failed to load with error: ${adError.message}")
    }

    override fun onAdsExhausted(preloadId: String) {
      Log.i(TAG, "Rewarded preload ad $preloadId is not available")
    }

    override fun onAdPreloaded(preloadId: String, responseInfo: ResponseInfo) {
      Log.i(TAG, "Rewarded preload ad $preloadId is available")
    }
  }
val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedAdPreloader.start(adUnitId, preloadConfig, preloadCallback)

자바

PreloadCallback preloadCallback =
    new PreloadCallback() {
      @Override
      public void onAdFailedToPreload(String preloadId, LoadAdError adError) {
        Log.d(
            TAG,
            String.format(
                "Rewarded preload ad %s failed to load with error: %s",
                preloadId, adError.getMessage()));
      }

      @Override
      public void onAdsExhausted(String preloadId) {
        Log.i(TAG, "Rewarded preload ad " + preloadId + " is not available");
      }

      @Override
      public void onAdPreloaded(String preloadId, ResponseInfo responseInfo) {
        Log.i(TAG, "Rewarded preload ad " + preloadId + " is available");
      }
    };

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedAdPreloader.start(adUnitId, preloadConfig, preloadCallback);

광고를 로드하지 못하면 GMA Next-Gen SDK 자동으로 광고를 미리 로드하고 미리 로드된 구성에 대해 실패한 요청을 재시도합니다. 실패 콜백에서 수동 로드 요청을 호출하지 마세요. 미리 로드 이벤트 콜백 메서드에서 pollAd, destroy 또는 start 메서드를 호출하지 마세요. 콜백에서 이러한 메서드를 호출하면 재귀 로드 루프가 호출될 수 있습니다.

선택사항: 광고 사용 가능 여부 확인

광고가 사용 가능한지 확인해야 하는 경우 광고 사용 가능 여부를 확인합니다. 다음 예에서는 미리 로드된 광고가 사용 가능한지 확인합니다.

Kotlin

private fun isAdAvailable(adUnitId: String): Boolean {
  return RewardedAdPreloader.isAdAvailable(adUnitId)
}

자바

private boolean isAdAvailable(String adUnitId) {
  return RewardedAdPreloader.isAdAvailable(adUnitId);
}

선택사항: 버퍼 크기 설정

버퍼 사이즈는 메모리에 보관되는 미리 로드된 광고 수를 제어합니다. 기본적으로 Google은 버퍼 크기를 최적화하여 메모리 소비와 광고 게재 지연 시간을 조정합니다. 맞춤 버퍼 크기를 설정하여 메모리에 보관되는 광고 수를 늘리거나 줄일 수 있습니다. 미리 로드된 광고 2개의 버퍼 크기를 사용하는 것이 좋습니다. 트래픽의 대부분이 메모리가 부족한 기기에서 발생하는 경우 버퍼 사이즈를 줄입니다.

다음 예에서는 버퍼 크기를 설정하는 방법을 보여줍니다.

Kotlin

val adRequest = AdRequest.Builder(adUnitId).build()
// Define a PreloadConfiguration and set the buffer size to 2 preloaded ads.
val preloadConfig = PreloadConfiguration(adRequest, bufferSize = 2)
RewardedAdPreloader.start(adUnitId, preloadConfig)

자바

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
// Define a PreloadConfiguration and set the buffer size to 2 preloaded ads.
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest, 2);
RewardedAdPreloader.start(adUnitId, preloadConfig);

미리 로드 캐시 한도

GMA Next-Gen SDK은(는) 모든 광고 단위 및 미리 로드 ID에서 미리 로드된 광고의 총 수에 앱 전체 한도를 적용합니다.

  • 기본 한도: Google은 메모리에 미리 로드된 광고를 최대 6개까지 보관합니다. 이 한도는 모든 형식과 미리 로드 ID 간에 공유됩니다.
  • 각 미리 로드 ID에 대해 버퍼 사이즈를 2로 유지하는 것이 좋습니다.

선택사항: 광고 미리 로드 중지

앱이 광고를 게재하는 동안 미리 로드를 활성 상태로 유지합니다. 이때 destroy 메서드를 사용하지 마세요. 세션에서 특정 미리 로드 ID의 광고를 다시 표시할 필요가 없는 경우 광고 미리 로드를 중지할 수 있습니다. 특정 미리 로드 ID의 광고 로드를 중지하려면 미리 로드 ID와 함께 destroy 메서드를 호출합니다. destroy 메서드를 호출하면 미리 로드 ID와 연결된 모든 미리 로드된 광고가 캐시에서 삭제됩니다.

다음 예에서는 광고 미리 로드를 중지하는 방법을 보여줍니다.

Kotlin

private fun stopPreloading(adUnitId: String) {
  // Stops the preloading and destroy preloaded ads.
  RewardedAdPreloader.destroy(adUnitId)
}

자바

private void stopPreloading(String adUnitId) {
  // Stops the preloading and destroy preloaded ads.
  RewardedAdPreloader.destroy(adUnitId);
}

선택사항: 응답 정보 읽기

캐시에서 광고를 삭제하지 않고 다음 미리 로드된 광고의 응답 정보를 읽습니다. 광고를 표시하기 전에 광고 메타데이터를 검사해야 하는 경우 pollAd 메서드를 호출하는 대신 응답 정보를 읽습니다.

다음 예에서는 다음 미리 로드된 광고 응답 정보를 읽는 방법을 보여줍니다.

Kotlin

val responseInfo = RewardedAdPreloader.peekAdResponseInfo(preloadId)
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.")
  return
}

Log.d(TAG, "Peeked ad response ID: ${responseInfo.responseId}")

Java

ResponseInfo responseInfo = RewardedAdPreloader.peekAdResponseInfo(preloadId);
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.");
  return;
}

Log.d(TAG, "Peeked ad response ID: " + responseInfo.getResponseId());