使ってみる

AdMob を使用して、C++ アプリで広告を表示できます。このガイドでは、Firebase と統合して Google Mobile Ads SDK を使用する方法を説明します。

このガイドを初めてお読みになる場合は、AdMob テストアプリをダウンロードして使用しながら進めることをおすすめします。

Firebase と統合する

  1. iOS 用の設定セクションまたは Android 用の設定セクションの手順を行って、AdMob と Firebase を C++ アプリに追加します。

    注: AdMob テストアプリを使用している場合、以下の手順は完了済みです。すぐにテストアプリを実行できるはずです。

  2. 次のヘッダーをアプリの C++ コードに含めます。

    #include "firebase/admob.h"
    #include "firebase/admob/types.h"
    #include "firebase/app.h"
    #include "firebase/future.h"
    
  3. 以下をアプリの C++ コードに含めて、AdMob ライブラリを AdMob アプリ ID で初期化します(このコードは、バナービューまたはインタースティシャル広告を作成する前に実行する必要があります)。

    #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 Mobile Ads 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 が完了になったら、インタースティシャル広告を次の区切りとなる自然なタイミングでアプリに表示する準備ができています。

BannerView および InterstitialAd クラス内のほとんどのメソッドには、アプリが特定のアクションについての直近の Future を取得するために使用できる、対応する「last result」メソッドがあります。たとえば、InterstitialAd::LoadAd() メソッドには、これに対応する InterstitialAd::LoadAdLastResult() というメソッドがあります。これは、InterstitialAd::LoadAd() メソッドへの前回の呼び出しのステータスの確認に使用できる Future を返します。

同様に、アプリは BannerView::InitializeLastResult() メソッドを使用して、BannerView::Initialize() メソッドへの前回の呼び出しのステータス(および存在する場合はエラーコード)を表現する 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 を取得します。ステータスが完了で、エラーコードが 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::SetListener() メソッドに渡すことができる BannerView::Listener 抽象クラスを提供しています。インタースティシャル広告の表示状態への変更について通知を受けるために拡張できる、同様の 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 に置き換えます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。