시작하기

C++ 앱에서 AdMob을 사용하여 광고를 게재할 수 있습니다. 이 가이드에서는 Firebase와 통합하고 Google 모바일 광고 SDK와 상호작용하는 방법을 보여줍니다.

이 가이드를 처음으로 진행하는 경우 우선 AdMob 테스트 앱을 다운로드하여 따라해 보는 것이 좋습니다.

Firebase와 통합

  1. iOS 설정 또는 Android 설정의 단계를 완료하여 C++ 앱에 AdMob 및 Firebase를 추가합니다.

  2. 앱의 C++ 코드에 다음 헤더를 포함합니다.

    #include "firebase/admob.h"
    #include "firebase/admob/types.h"
    #include "firebase/app.h"
    #include "firebase/future.h"
    
  3. 앱의 C++ 코드에 다음을 추가하여 AdMob 앱 ID로 AdMob 라이브러리를 초기화합니다. 배너 보기 또는 전면 광고를 만들기 전에 이 코드를 실행해야 합니다.

    #if defined(__ANDROID__)
    // Create the Firebase app.
    firebase::App* app =
        firebase::App::Create(firebase::AppOptions(),
                              your_jni_env,
                              your_android_activity);
    
    // Your Android AdMob app ID.
    const char* kAdMobAppID = "ca-app-pub-XXXXXXXXXXXXXXXX~NNNNNNNNNN";
    #else
    // Create the Firebase app.
    firebase::App* app =
        firebase::App::Create(firebase::AppOptions());
    
    // Your iOS AdMob app ID.
    const char* kAdMobAppID = "ca-app-pub-XXXXXXXXXXXXXXXX~NNNNNNNNNN";
    #endif  // __ANDROID__
    
    // Initialize the AdMob library with your AdMob app ID.
    firebase::admob::Initialize(*app, kAdMobAppID);
    

Google 모바일 광고 SDK와 상호작용

광고 단위 ID 설정

iOS와 Android 모두에서 지원되는 C++ 코드를 작성할 때는 전처리기 명령을 사용하여 특정 OS에서만 컴파일되는 코드를 정의해야 할 수 있습니다. iOS와 Android 모두에서 배너 및 전면 광고를 표시하려는 경우 OS 및 고유한 광고 게재위치마다 새 광고 단위 ID를 만드는 것이 좋습니다. 다음 광고 단위 ID는 iOS 및 Android용으로 생성되었으며 항상 테스트 광고를 게재하도록 구성되어 있습니다.

#if defined(__ANDROID__)
// Android ad unit IDs
const char* kBannerAdUnit = "ca-app-pub-3940256099942544/6300978111";
const char* kInterstitialAdUnit = "ca-app-pub-3940256099942544/1033173712";
#else
// iOS ad unit IDs
const char* kBannerAdUnit = "ca-app-pub-3940256099942544/2934735716";
const char* kInterstitialAdUnit = "ca-app-pub-3940256099942544/4411468910";
#endif

배너 보기 설정

앱의 C++ 코드에 다음 헤더를 추가합니다.

#include "firebase/admob/banner_view.h"

BannerView 개체를 선언하고 인스턴스화합니다.

firebase::admob::BannerView* banner_view;
banner_view = new firebase::admob::BannerView();

AdSize를 만들고 배너 보기를 초기화합니다.

firebase::admob::AdSize ad_size;
ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
ad_size.width = 320;
ad_size.height = 50;
// my_ad_parent is a reference to an iOS UIView or an Android Activity.
// This is the parent UIView or Activity of the banner view.
banner_view->Initialize(static_cast<firebase::admob::AdParent>(my_ad_parent), kBannerAdUnit, ad_size);

전면 광고 설정

앱의 C++ 코드에 다음 헤더를 추가합니다.

#include "firebase/admob/interstitial_ad.h"

InterstitialAd 개체를 선언하고 인스턴스화합니다.

firebase::admob::InterstitialAd* interstitial_ad;
interstitial_ad = new firebase::admob::InterstitialAd();

전면 광고를 초기화합니다.

// my_ad_parent is a reference to an iOS UIView or an Android Activity.
// This is the parent UIView or Activity of the interstitial ad.
interstitial_ad->Initialize(static_cast<firebase::admob::AdParent>(my_ad_parent), kInterstitialAdUnit);

AdMob 광고 요청 만들기

AdMob 라이브러리를 사용하면 광고 요청에 맞춤 타겟팅 정보를 제공할 수 있습니다. 이렇게 하려면 AdRequest 구조체의 멤버를 설정한 후 BannerView::LoadAd() 또는 InterstitialAd::LoadAd() 메소드에 전달합니다.

광고 요청 타겟팅 및 맞춤설정에 대한 일반적인 내용은 iOSAndroid 타겟팅 가이드를 참조하세요.

다음은 BannerViewInterstitialAd에서 광고 요청을 만드는 데 사용하는 AdRequest 구조체입니다.

struct AdRequest {
  const char **test_device_ids;
  unsigned int test_device_id_count;
  const char **keywords;
  unsigned int keyword_count;
  const KeyValuePair *extras;
  unsigned int extras_count;
  int birthday_day;
  int birthday_month;
  int birthday_year;
  Gender gender;
  ChildDirectedTreatmentState tagged_for_child_directed_treatment;
};

AdRequest 구조체를 선언하고 초기화합니다.

// Initialize all the AdRequest struct member values to zero.
firebase::admob::AdRequest my_ad_request = {};

다음 코드에서는 AdRequest 구조체의 멤버 값을 설정하여 광고 요청에 타겟팅 정보를 추가합니다.

// If the app is aware of the user's gender, it can be added to the
// targeting information. Otherwise, "unknown" should be used.
my_ad_request.gender = firebase::admob::kGenderUnknown;

// The user's birthday, if known. Note that months are indexed from one.
my_ad_request.birthday_day = 10;
my_ad_request.birthday_month = 11;
my_ad_request.birthday_year = 1976;

// Additional keywords to be used in targeting.
static const char* kKeywords[] = {"AdMob", "C++", "Fun"};
my_ad_request.keyword_count = sizeof(kKeywords) / sizeof(kKeywords[0]);
my_ad_request.keywords = kKeywords;

// "Extra" key value pairs can be added to the request as well.
static const firebase::admob::KeyValuePair kRequestExtras[] = {
    {"the_name_of_an_extra", "the_value_for_that_extra"}};
my_ad_request.extras_count = sizeof(kRequestExtras) / sizeof(kRequestExtras[0]);
my_ad_request.extras = kRequestExtras;

// Register the device IDs associated with any devices that will be used to
// test your app. Below are sample test device IDs used for making the ad request.
static const char* kTestDeviceIDs[] =
    {"2077ef9a63d2b398840261c8221a0c9b",
     "098fe087d987c9a878965454a65654d7"};
my_ad_request.test_device_id_count =
    sizeof(kTestDeviceIDs) / sizeof(kTestDeviceIDs[0]);
my_ad_request.test_device_ids = kTestDeviceIDs;

AdRequest 구조체를 BannerView::LoadAd()Interstitial::LoadAd() 메소드에 전달합니다.

banner_view->LoadAd(my_ad_request);
interstitial_ad->LoadAd(my_ad_request);

Note: A single `AdRequest` struct can be reused for multiple calls.

Future를 사용하여 메소드 호출의 완료 상태 모니터링

Future를 사용하면 이전에 호출한 BannerView 또는 InterstitialAd 메소드의 완료 상태를 파악할 수 있습니다. 예를 들어 InterstitialAd::LoadAd() 메소드를 호출하면 새 Future가 생성 및 반환됩니다. 앱은 Future의 상태를 조사하여 광고가 로드된 시점을 판단할 수 있습니다. Future가 완료되면 앱에서 다음 번에 발생하는 적절한 중지 시점에 전면 광고를 표시할 준비가 된 것입니다.

BannerViewInterstitialAd 클래스에 있는 대부분의 메소드는 상응하는 '최종 결과' 메소드를 가지며, 앱은 이 메소드로 특정 작업의 가장 최근 Future를 검색할 수 있습니다. 예를 들어 InterstitialAd::LoadAd() 메소드에는 InterstitialAd::LoadAdLastResult()라는 메소드가 있습니다. 이 메소드가 반환하는 Future로 마지막 InterstitialAd::LoadAd() 메소드 호출의 상태를 확인할 수 있습니다.

마찬가지로 앱에서 BannerView::InitializeLastResult() 메소드를 사용하여 마지막 BannerView::Initialize() 메소드 호출의 상태 및 오류 발생 시 오류 코드를 나타내는 Future를 가져올 수 있습니다. Future가 완료 상태이고 오류 코드가 firebase::admob::kAdMobErrorNone이면 BannerView::Show() 메소드를 호출하여 배너 보기를 표시할 수 있습니다.

if (banner_view->InitializeLastResult().status() ==
    firebase::kFutureStatusComplete &&
    banner_view->InitializeLastResult().error() ==
    firebase::admob::kAdMobErrorNone) {
  banner_view->Show();
}

마지막 BannerView::Show() 메소드 호출에 대한 Future가 완료 상태가 되면 배너 보기에 광고를 로드할 준비가 된 것입니다.

if (banner_view->ShowLastResult().status() ==
    firebase::kFutureStatusComplete &&
    banner_view->ShowLastResult().error() ==
    firebase::admob::kAdMobErrorNone) {
  banner_view->LoadAd(my_ad_request);
}

전면 광고의 경우 InterstitialAd::InitializeLastResult() 메소드를 사용하여 마지막 InterstitialAd::Initialize() 메소드 호출의 상태 및 오류 발생 시 오류 코드를 나타내는 Future를 가져옵니다. Future가 완료 상태이고 오류 코드가 firebase::admob::kAdMobErrorNone이면 전면 광고를 로드할 준비가 된 것입니다.

if (interstitial_ad->InitializeLastResult().status() ==
    firebase::kFutureStatusComplete &&
    interstitial_ad->InitializeLastResult().error() ==
    firebase::admob::kAdMobErrorNone) {
  interstitial_ad->LoadAd(my_ad_request);
}

마지막 InterstitialAd::LoadAd() 메소드 호출에 대한 Future가 완료 상태가 되면 앱에서 다음 번에 발생하는 적절한 중지 시점에 전면 광고를 표시할 준비가 된 것입니다.

if (interstitial_ad->LoadAdLastResult().status() ==
    firebase::kFutureStatusComplete &&
    interstitial_ad->LoadAdLastResult().error() ==
    firebase::admob::kAdMobErrorNone) {
  interstitial_ad->Show();
}

Future 완료 시에 호출되는 콜백을 등록할 수도 있습니다. 다음 코드에서는 함수 포인터를 콜백으로 사용합니다.

// Initialize the interstitial ad.
interstitial_ad->Initialize(static_cast<firebase::admob::AdParent>(my_ad_parent), kInterstitialAdUnit);

// Registers the OnCompletion callback. user_data is a pointer that is passed verbatim
// to the callback as a void*. In this example, we pass the interstitial ad object to be
// used in the OnCompletionCallback function.
interstitial_ad->InitializeLastResult().OnCompletion(OnCompletionCallback, interstitial_ad /*user_data*/);

// The OnCompletion callback function.
static void OnCompletionCallback(const firebase::Future<void>& future, void* user_data) {
  // Called when the Future is completed for the last call to the InterstitialAd::Initialize()
  // method. If the error code is firebase::admob::kAdMobErrorNone, then you're ready to
  // load the interstitial ad.
  firebase::admob::InterstitialAd *interstitial_ad = static_cast<firebase::admob::InterstitialAd*>(user_data);
  if (future.error() == firebase::admob::kAdMobErrorNone) {
    interstitial_ad->LoadAd(my_ad_request);
  }
}

리스너를 사용하여 광고 수명 주기 이벤트 알림 받기

AdMob이 제공하는 추상 BannerView::Listener 클래스를 확장하여 BannerView::SetListener() 메소드에 전달하면 배너 보기의 표시 상태 및 경계 상자의 변경에 대해 알림을 받을 수 있습니다. 마찬가지로 전면 광고용으로 제공되는 추상 InterstitialAd::Listener 클래스를 확장하여 전면 광고의 표시 상태 변경 알림을 받을 수 있습니다.

다음은 BannerView::Listener 클래스를 확장하는 클래스를 구현한 예시입니다. 전면 광고에도 비슷한 구현을 사용할 수 있습니다.

class ExampleBannerViewListener
    : public firebase::admob::BannerView::Listener {
public:
  ExampleBannerViewListener() {}

  void OnPresentationStateChanged(
      firebase::admob::BannerView* banner_view,
      firebase::admob::BannerView::PresentationState state) override {
    // This method gets called when the banner view's presentation
    // state changes.
  }

  void OnBoundingBoxChanged(
      firebase::admob::BannerView* banner_view,
      firebase::admob::BoundingBox box) override {
    // This method gets called when the banner view's bounding box
    // changes.
  }
};

다음 단계

AdMob으로 앱에서 수익을 창출하고 이 가이드에서 사용된 테스트 광고 단위 ID를 내 광고 단위 ID로 대체하는 방법을 알아봅니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.