本指南适用于希望借助 AdMob 通过 C++ 应用创收,但不使用 Firebase 的发布商。如果您打算或考虑在应用中添加 Firebase,请改为参阅本指南的 AdMob 与 Firebase 版本。
要展示广告并赚取收入,第一步是将 Google 移动广告 C++ SDK 集成到应用中。集成 SDK 后,您可以选择一种广告格式(例如插页式广告或激励广告),然后按照相应步骤进行实现。
Google 移动广告 C++ SDK 封装了 Google 移动广告 iOS 和 Android SDK,并且仅适用于这些平台。Google 移动广告 C++ SDK 使用 Firebase C++ 结构来支持异步操作,因此它位于 firebase::gma
命名空间中。
如果这是您首次依据本指南进行操作,我们建议您下载 Google 移动广告 C++ 测试应用并按照说明操作。
前提条件
Android
- 使用 Android Studio 3.2 或更高版本
- 确保您应用的 build 文件使用以下值:
minSdkVersion
为 16 或更高版本compileSdkVersion
为 28 或更高版本
iOS
- 使用 Xcode 13 或更高版本
- 定位到 iOS 10.0 或更高版本
在您的 AdMob 账号中设置应用
完成以下步骤,将您的应用注册为 AdMob 应用:
在 AdMob 中注册您的应用。此步骤将创建一个具有唯一 AdMob 应用 ID 的 AdMob 应用,本指南稍后需要用到此 ID。
安装 Google 移动广告 C++ SDK
由于 Google 移动广告 C++ SDK 位于 firebase::gma
命名空间中,因此请下载 Firebase C++ SDK,然后将其解压缩到您选择的目录中。
Firebase C++ SDK 并不局限于特定平台,但需要配置平台专用库。
Android
我们建议您使用 CMake,您也可以在我们常规的 Firebase C++ SDK 入门指南中找到 ndk-build 的相关说明,并按照该说明将 libfirebase_app.a
和 libfirebase_gma.a
关联到您的应用。
在项目的
gradle.properties
文件中,指定解压缩的 SDK 的位置:systemProp.firebase_cpp_sdk.dir=FULL_PATH_TO_SDK
在项目的
settings.gradle
文件中,添加以下内容:def firebase_cpp_sdk_dir = System.getProperty('firebase_cpp_sdk.dir') gradle.ext.firebase_cpp_sdk_dir = "$firebase_cpp_sdk_dir" includeBuild "$firebase_cpp_sdk_dir"
在您的模块(应用级)Gradle 文件(通常是
app/build.gradle
)中添加以下内容,其中包含 Google 移动广告 C++ SDK 的库依赖项。android.defaultConfig.externalNativeBuild.cmake { arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir" } # Add the dependency for the Google Mobile Ads C++ SDK apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle" firebaseCpp.dependencies { gma }
在项目的
CMakeLists.txt
文件中,添加以下内容。# Add Firebase libraries to the target using the function from the SDK. add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL) # Add the Google Mobile Ads C++ SDK. # The Firebase C++ library `firebase_app` is required, # and it must always be listed last. set(firebase_libs firebase_gma firebase_app ) target_link_libraries(${target_name} "${firebase_libs}")
同步您的应用以确保所有依赖项都具有必要的版本。
iOS
本部分中的步骤说明了如何将 Google 移动广告 C++ SDK 添加到您的 iOS 项目中。
运行以下命令,获取 CocoaPods 1 或更高版本:
sudo gem install cocoapods --pre
从已解压缩的 SDK 添加 Google 移动广告 Pod。
如果您没有 Podfile,请创建一个:
cd APP_DIRECTORY
pod init
将用于 Google 移动广告 C++ SDK、Google User Messaging Platform SDK 和最小 Firebase 核心 SDK(GMA C++ SDK 所需)的 pod 添加到您的 Podfile:
pod 'Firebase/CoreOnly' pod 'Google-Mobile-Ads-SDK' pod 'GoogleUserMessagingPlatform'
安装 Pod,然后在 Xcode 中打开
.xcworkspace
文件。pod install
open APP.xcworkspace
将 Firebase C++ SDK 中的以下框架添加到项目中:
xcframeworks/firebase.xcframework
xcframeworks/firebase_gma.xcframework
您已准备就绪!您的 C++ 应用已配置为使用 Google 移动广告 C++ SDK,而不使用任何其他 Firebase 服务。
配置应用的 AdMob 应用 ID
Android
按照移动广告 SDK Android 指南中所述的配置应用第 3 步操作,然后返回此页面。
iOS
按照移动广告 SDK iOS 指南中所述的更新 Info.plist 步骤操作,然后返回此页面。
初始化 Google 移动广告 SDK
加载广告之前,请先调用 firebase::gma::Initialize()
,以便让应用初始化 Google 移动广告 C++ SDK。该方法将初始化相应 SDK,并在初始化完成后或 30 秒超时后完成 firebase::Future
。此操作仅需执行一次,最好是在应用启动时执行。
在调用 Initialize()
时,Google 移动广告 C++ SDK 或中介合作伙伴 SDK 可能会预加载广告。如果您需要获得欧洲经济区 (EEA) 用户的同意,请设置任何专门用于特定请求的标记(例如 tag_for_child_directed_treatment
或 tag_for_under_age_of_consent
),或者在加载广告之前采取任何其他相关操作,并确保在初始化 Google 移动广告 C++ SDK 之前先调用 firebase::gma::SetRequestConfiguration()
。如需了解详情,请参阅我们的定位指南。
以下示例展示了如何调用 Initialize()
:
Android
// Initialize the Google Mobile Ads library
firebase::InitResult result;
Future<AdapterInitializationStatus> future =
firebase::gma::Initialize(jni_env, j_activity, &result);
if (result != kInitResultSuccess) {
// Initialization immediately failed, most likely due to a missing
// dependency. Check the device logs for more information.
return;
}
// Monitor the status of the future.
// See "Use a Future to monitor the completion status of a method call" below.
if (future.status() == firebase::kFutureStatusComplete &&
future.error() == firebase::gma::kAdErrorCodeNone) {
// Initialization completed.
} else {
// Initialization on-going, or an error has occurred.
}
iOS
// Initialize the Google Mobile Ads library.
firebase::InitResult result;
Future<AdapterInitializationStatus> future =
firebase::gma::Initialize(&result);
if (result != kInitResultSuccess) {
// Initialization immediately failed, most likely due to a missing
// dependency. Check the device logs for more information.
return;
}
// Monitor the status of the future.
// See "Use a Future to monitor the completion status of a method call" below.
if (future.status() == firebase::kFutureStatusComplete &&
future.error() == firebase::gma::kAdErrorCodeNone) {
// Initialization completed.
} else {
// Initialization on-going, or an error has occurred.
}
使用 Future
监控方法调用的完成状态
Future
提供了一种方法来确定异步方法调用的完成状态。
例如,当您的应用调用 firebase::gma::Initialize()
时,系统会创建并返回一个新的 firebase::Future
。然后,您的应用就可以轮询 Future
的 status()
,以确定初始化是否已完成。完成后,您的应用便可以调用 result()
来获取生成的 AdapterInitializationStatus
。
返回 Future
的方法都有一个对应的“last result”(上次结果)方法,应用可以使用这一方法来获取给定操作的最新 Future
。例如,firebase::gma::Initialize()
有一个名为 firebase::gma::InitializeLastResult()
的对应方法,该方法会返回一个 Future
,您的应用可以用其来检查上次调用 firebase::gma::Initialize()
的状态。
如果 Future
的状态为已完成,且其错误代码为 firebase::gma::kAdErrorCodeNone
,则表示操作成功完成。
您还可以注册当 Future
变成已完成状态时要调用的回调函数。在某些情况下,回调函数会在不同的线程中运行,因此请确保您的代码具有线程安全性。以下代码段使用了一个函数指针来实现回调:
// Registers the OnCompletion callback. user_data is a pointer that is passed verbatim
// to the callback as a void*. This allows you to pass any custom data to the callback
// handler. In this case, the app has no data, so you must pass nullptr.
firebase::gma::InitializeLastResult().OnCompletion(OnCompletionCallback,
/*user_data=*/nullptr);
// The OnCompletion callback function.
static void OnCompletionCallback(
const firebase::Future<AdapterInitializationStatus>& future, void* user_data) {
// Called when the Future is completed for the last call to firebase::gma::Initialize().
// If the error code is firebase::gma::kAdErrorCodeNone,
// then the SDK has been successfully initialized.
if (future.error() == firebase::gma::kAdErrorCodeNone) {
// success!
} else {
// failure.
}
}
选择广告格式
现已导入 Google 移动广告 C++ SDK,您随时可以植入广告了。AdMob 提供了许多不同的广告格式,您可以根据您应用的用户体验选择最契合的一款。
横幅
横幅广告是在设备屏幕的顶部或底部展示的矩形广告。用户与应用互动时,横幅广告会停留在界面上,并且可在一段时间后自动刷新。如果您刚开始接触移动广告,建议从横幅广告着手。
插页式广告
插页式广告是全屏广告,它会覆盖整个应用界面,直到用户将其关闭。在应用执行流程的自然停顿点,例如游戏的不同关卡之间,或一项任务完成后,最适合投放这类广告。
激励广告
向观看短视频和与试玩广告及问卷调查互动的用户予以奖励的广告。该广告可供免费畅玩的应用创收。