Check out what’s new from Firebase at Google I/O 2022. Learn more

Bắt đầu

Bạn có thể sử dụng AdMob để hiển thị quảng cáo trong ứng dụng C ++ của mình. Hướng dẫn này chỉ cho bạn cách tích hợp với Firebase và tương tác với SDK quảng cáo trên thiết bị di động của Google.

Nếu đây là lần đầu tiên bạn xem qua hướng dẫn này, bạn nên tải xuống và làm theo bằng ứng dụng thử nghiệm AdMob .

Tích hợp với Firebase

  1. Hoàn thành các bước trong phần Thiết lập cho iOS hoặc Thiết lập cho Android để thêm AdMob và Firebase vào ứng dụng C ++ của bạn.

  2. Bao gồm các tiêu đề sau trong mã C ++ của ứng dụng của bạn:

    #include "firebase/admob.h"
    #include "firebase/admob/types.h"
    #include "firebase/app.h"
    #include "firebase/future.h"
    
  3. Thêm mã sau vào mã C ++ trong ứng dụng của bạn để khởi chạy thư viện AdMob với ID ứng dụng AdMob của bạn (mã này phải được thực thi trước khi tạo chế độ xem biểu ngữ hoặc quảng cáo xen kẽ):

    #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);
    

Tương tác với SDK quảng cáo trên điện thoại di động của Google

Thiết lập ID đơn vị quảng cáo

Khi viết mã C ++ được hỗ trợ trên cả iOS và Android, bạn có thể cần sử dụng chỉ thị tiền xử lý để xác định mã chỉ nên được biên dịch trên một hệ điều hành cụ thể. Để hiển thị quảng cáo biểu ngữ và quảng cáo xen kẽ trên cả iOS và Android, bạn nên tạo ID đơn vị quảng cáo mới cho từng hệ điều hành và từng vị trí đặt quảng cáo duy nhất. Các ID đơn vị quảng cáo sau đã được tạo cho iOS và Android và được định cấu hình để luôn phân phát quảng cáo thử nghiệm:

#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

Thiết lập chế độ xem biểu ngữ

Thêm tiêu đề sau vào mã C ++ của ứng dụng của bạn:

#include "firebase/admob/banner_view.h"

Khai báo và khởi tạo đối tượng BannerView :

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

Tạo một AdSize và khởi chạy chế độ xem biểu ngữ:

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);

Thiết lập quảng cáo trung gian

Thêm tiêu đề sau vào mã C ++ của ứng dụng của bạn:

#include "firebase/admob/interstitial_ad.h"

Khai báo và khởi tạo đối tượng InterstitialAd :

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

Khởi tạo quảng cáo xen kẽ:

// 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);

Tạo yêu cầu quảng cáo AdMob

Thư viện AdMob cho phép bạn cung cấp thông tin nhắm mục tiêu tùy chỉnh cho một yêu cầu quảng cáo. Điều này được thực hiện bằng cách đặt các thành viên của cấu trúc AdRequest . Sau đó, cấu trúc được chuyển đến phương BannerView::LoadAd() hoặc InterstitialAd::LoadAd() .

Để biết thông tin chung về nhắm mục tiêu và tùy chỉnh các yêu cầu quảng cáo, hãy xem hướng dẫn Nhắm mục tiêu trên iOSAndroid của chúng tôi.

Đây là cấu trúc AdRequest được sử dụng bởi BannerViewInterstitialAd để đưa ra yêu cầu quảng cáo:

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;
};

Khai báo và khởi tạo cấu trúc AdRequest :

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

Đoạn mã sau đặt các giá trị thành viên của cấu trúc AdRequest để thêm thông tin nhắm mục tiêu vào yêu cầu quảng cáo:

// 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;

Chuyển cấu trúc AdRequest đến các phương 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.

Sử dụng Futures để theo dõi trạng thái hoàn thành của các lệnh gọi phương thức

Futures cung cấp cho bạn một cách để xác định trạng thái hoàn thành của các lệnh gọi phương thức BannerView hoặc InterstitialAd trước đó của bạn. Ví dụ: khi một lệnh gọi đến phương thức InterstitialAd::LoadAd() , một Tương lai mới sẽ được tạo và trả về. Các ứng dụng có thể thăm dò trạng thái của Tương lai để xác định thời điểm quảng cáo đã tải. Khi Tương lai hoàn tất, quảng cáo xen kẽ đã sẵn sàng để hiển thị tại điểm dừng tự nhiên tiếp theo trong ứng dụng của bạn.

Hầu hết các phương thức trong lớp BannerViewInterstitialAd đều có phương thức "kết quả cuối cùng" tương ứng mà ứng dụng có thể sử dụng để truy xuất Tương lai gần đây nhất cho một hành động nhất định. Ví dụ, phương thức InterstitialAd :: LoadAd ( InterstitialAd::LoadAd() có một phương thức tương ứng được gọi là InterstitialAd::LoadAdLastResult() . Nó trả về Tương lai có thể được sử dụng để kiểm tra trạng thái của lần gọi cuối cùng đến phương thức InterstitialAd::LoadAd() .

Tương tự, các ứng dụng có thể sử dụng phương BannerView::InitializeLastResult() để lấy Tương lai đại diện cho trạng thái (và mã lỗi, nếu có) của lần gọi cuối cùng đến phương BannerView::Initialize() . Nếu trạng thái của nó đã hoàn tất và mã lỗi của nó là firebase::admob::kAdMobErrorNone , thì bạn đã sẵn sàng để hiển thị chế độ xem biểu ngữ bằng cách gọi phương BannerView::Show() :

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

Khi trạng thái của Tương lai cho lần gọi cuối cùng đến phương BannerView::Show() hoàn tất, thì bạn đã sẵn sàng tải một quảng cáo vào chế độ xem biểu ngữ:

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

Đối với quảng cáo xen kẽ, hãy sử dụng phương thức InterstitialAd::InitializeLastResult() để nhận Tương lai biểu thị trạng thái (và mã lỗi, nếu có) của lần gọi cuối cùng đến phương thức InterstitialAd::Initialize() . Nếu trạng thái của nó đã hoàn tất và mã lỗi của nó là firebase::admob::kAdMobErrorNone , thì bạn đã sẵn sàng tải quảng cáo xen kẽ:

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

Khi trạng thái Tương lai cho lần gọi cuối cùng đến phương thức InterstitialAd::LoadAd() hoàn tất, thì bạn đã sẵn sàng hiển thị quảng cáo xen kẽ tại điểm dừng tự nhiên tiếp theo trong ứng dụng của mình:

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

Bạn cũng có thể đăng ký các lệnh gọi lại sẽ được gọi khi Tương lai hoàn thành. Đoạn mã này sử dụng một con trỏ hàm cho lệnh gọi lại:

// 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);
  }
}

Sử dụng trình nghe để được thông báo về các sự kiện trong vòng đời quảng cáo

AdMob cung cấp một BannerView::Listener trừu tượng mà bạn có thể mở rộng và chuyển đến phương BannerView::SetListener() để được thông báo về các thay đổi đối với trạng thái trình bày và hộp giới hạn của chế độ xem biểu ngữ. Một lớp InterstitialAd::Listener trừu tượng tương tự cũng được cung cấp cho quảng cáo xen kẽ có thể được mở rộng để được thông báo về những thay đổi đối với trạng thái trình bày của quảng cáo xen kẽ.

Dưới đây là ví dụ về cách triển khai lớp mở rộng lớp BannerView::Listener (cách triển khai tương tự có thể được sử dụng cho quảng cáo xen kẽ):

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.
  }
};

Cái gì tiếp theo

Tìm hiểu cách kiếm tiền từ ứng dụng của bạn với AdMob và đảm bảo thay thế các ID đơn vị quảng cáo thử nghiệm được sử dụng trong hướng dẫn này bằng ID đơn vị quảng cáo của riêng bạn.