插页式广告是全屏广告,它会覆盖整个应用界面, 被用户关闭它们通常在 例如 activity 之间或应用之间的暂停期间 游戏关卡当应用展示插页式广告时,用户可以自行选择 用户点击广告并继续访问其目标网址,或者关闭广告并返回 。 案例研究。
本指南介绍了如何将插页式广告植入到 iOS 应用中。
前提条件
- Google 移动广告 SDK 8.0.0 或更高版本。
- 完成入门指南。
始终使用测试广告进行测试
在构建和测试应用时,请务必使用测试广告 实际投放的广告。否则,可能会导致您的账号被暂停。
加载测试广告最简便的方法就是使用我们的专用测试广告单元 ID
对于 iOS 插页式广告:
/21775744923/example/interstitial
该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告, 在自己应用的编码、测试和调试过程中随意使用。只需制作 请务必在发布应用前用您自己的广告单元 ID 替换该测试广告单元。
如需详细了解移动广告 SDK 的测试广告如何运作,请参阅 测试广告。
实现
植入插页式广告的主要步骤如下所示:
- 加载广告。
- 注册回调。
- 展示广告并处理奖励事件。
加载广告
广告的加载是使用
load(adUnitID:request)
方法(在
GAMInterstitialAd
类。
Swift
import GoogleMobileAds
import UIKit
class ViewController: UIViewController {
private var interstitial: GAMInterstitialAd?
override func viewDidLoad() {
super.viewDidLoad()
Task {
do {
interstitial = try await GAMInterstitialAd.load(
withAdUnitID: "/21775744923/example/interstitial", request: GAMRequest())
} catch {
print("Failed to load interstitial ad with error: \(error.localizedDescription)")
}
}
}
}
SwiftUI
import GoogleMobileAds
class InterstitialViewModel: NSObject, GADFullScreenContentDelegate {
private var interstitialAd: GADInterstitialAd?
func loadAd() async {
do {
interstitialAd = try await GADInterstitialAd.load(
withAdUnitID: "ca-app-pub-3940256099942544/4411468910", request: GADRequest())
interstitialAd?.fullScreenContentDelegate = self
} catch {
print("Failed to load interstitial ad with error: \(error.localizedDescription)")
}
}
Objective-C
@import GoogleMobileAds;
@import UIKit;
@interface ViewController ()
@property(nonatomic, strong) GAMInterstitialAd *interstitial;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
GAMRequest *request = [GAMRequest request];
[GAMInterstitialAd loadWithAdManagerAdUnitID:@"/21775744923/example/interstitial"
request:request
completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
if (error) {
NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
return;
}
self.interstitial = ad;
}];
}
注册回调
要接收有关展示事件的通知,您必须实现
GADFullScreenContentDelegate
协议,并将其分配给
返回的广告的 fullScreenContentDelegate
属性。通过
GADFullScreenContentDelegate
协议负责在广告
展示成功或失败,以及何时关闭。以下
代码展示了如何实施协议并将其分配给广告:
Swift
import GoogleMobileAds
import UIKit
class ViewController: UIViewController, GADFullScreenContentDelegate {
private var interstitial: GAMInterstitialAd?
override func viewDidLoad() {
super.viewDidLoad()
Task {
do {
interstitial = try await GAMInterstitialAd.load(
withAdUnitID: "/21775744923/example/interstitial", request: GAMRequest())
interstitial?.fullScreenContentDelegate = self
} catch {
print("Failed to load interstitial ad with error: \(error.localizedDescription)")
}
}
}
/// Tells the delegate that the ad failed to present full screen content.
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
print("Ad did fail to present full screen content.")
}
/// Tells the delegate that the ad will present full screen content.
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("Ad will present full screen content.")
}
/// Tells the delegate that the ad dismissed full screen content.
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("Ad did dismiss full screen content.")
}
}
SwiftUI
将 fullScreenContentDelegate
属性分配给返回的广告:
interstitialAd?.fullScreenContentDelegate = self
实现协议:
func adDidRecordImpression(_ ad: GADFullScreenPresentingAd) {
print("\(#function) called")
}
func adDidRecordClick(_ ad: GADFullScreenPresentingAd) {
print("\(#function) called")
}
func ad(
_ ad: GADFullScreenPresentingAd,
didFailToPresentFullScreenContentWithError error: Error
) {
print("\(#function) called")
}
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("\(#function) called")
}
func adWillDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("\(#function) called")
}
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("\(#function) called")
// Clear the interstitial ad.
interstitialAd = nil
}
Objective-C
@import GoogleMobileAds;
@import UIKit;
@interface ViewController () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GAMInterstitialAd *interstitial;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
GAMRequest *request = [GAMRequest request];
[GAMInterstitialAd loadWithAdManagerAdUnitID:@"/21775744923/example/interstitial"
request:request
completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
if (error) {
NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
return;
}
self.interstitial = ad;
self.interstitial.fullScreenContentDelegate = self;
}];
}
/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
NSLog(@"Ad did fail to present full screen content.");
}
/// Tells the delegate that the ad will present full screen content.
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"Ad will present full screen content.");
}
/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"Ad did dismiss full screen content.");
}
GAMInterstitialAd
是一次性对象。这个
是指插页式广告在展示后就不能再展示了。最佳
加载另一个插页式广告
adDidDismissFullScreenContent:
方法(在 GADFullScreenContentDelegate
上),
与上一个插页式广告相同时,下一个插页式广告
已关闭。
展示广告
插页式广告应在应用流程的自然停顿期间 (以游戏关卡之间或用户完成一项任务后为例)。
Swift
guard let interstitial = interstitial else {
return print("Ad wasn't ready.")
}
// The UIViewController parameter is an optional.
interstitial.present(fromRootViewController: nil)
SwiftUI
监听视图中的界面事件,以确定何时展示广告。
var body: some View {
// ...
}
.onChange(of: countdownTimer.isComplete) { newValue in
showGameOverAlert = newValue
}
.alert(isPresented: $showGameOverAlert) {
Alert(
title: Text("Game Over"),
message: Text("You lasted \(countdownTimer.countdownTime) seconds"),
dismissButton: .cancel(
Text("OK"),
action: {
viewModel.showAd()
}))
通过视图模型展示插页式广告:
func showAd() {
guard let interstitialAd = interstitialAd else {
return print("Ad wasn't ready.")
}
interstitialAd.present(fromRootViewController: nil)
}
Objective-C
if (self.interstitial) {
// The UIViewController parameter is nullable.
[self.interstitial presentFromRootViewController:nil];
} else {
NSLog(@"Ad wasn't ready");
}
最佳做法
- 考虑插页式广告这种广告类型是否适合您的应用。
- 在具有自然过渡点的应用中,插页式广告的效果最好。 应用内任务的结束,例如分享图片或完成某项任务 游戏关卡,就会产生这样一个点。因为用户希望在 用户可以轻松展示插页式广告 体验。请务必考虑在应用工作流的哪些时间点 展示插页式广告以及用户可能会如何响应。
- 务必在展示插页式广告时暂停操作。
- 插页式广告有多种类型:文字广告、图片广告
视频等务必要确保您的应用在显示
但它也会暂停使用某些资源
请充分利用它们例如,当您调用
插页式广告,请务必暂停应用产生的所有音频输出。
您可以在
adDidDismissFullScreenContent:
事件处理脚本,将在用户完成互动时调用 。此外,请考虑暂时停止所有密集计算 任务(例如游戏循环)。这样可以确保 确保用户不会遇到图像无响应、响应缓慢或卡顿的现象 视频。 - 留出充足的加载时间。
- 正如确保在展示位置中展示插页式广告 设置合适的时间,同样重要的是确保用户无需 等它们加载完毕在您打算展示广告之前,提前加载广告 可以确保您的应用在 是时候展示一下了。
- 不要向用户展示太多广告。
- 虽然提高插页式广告在应用中的展示频次似乎 例如增加收入的好方法,但这也会影响用户体验 和较低的点击率。确保用户不会过于频繁地 打断了他们,导致他们无法继续使用您的应用。
- 请勿使用加载完成回调展示插页式广告。
- 这可能会导致用户体验不佳。您应先预加载广告
使用起来非常简单然后检查
canPresentFromRootViewController:error:
方法 以了解是否可以在GAMInterstitialAd
中使用 。
GitHub 上的示例
以您的首选语言查看完整的插页式广告示例: