Dieser Leitfaden richtet sich an Publisher, die App-Start-Anzeigen einbinden.
App-Start-Anzeigen sind ein spezielles Anzeigenformat für Publisher, die die Ladebildschirme ihrer Apps monetarisieren möchten. App-Start-Anzeigen können von Ihren Nutzern jederzeit geschlossen werden. App-Start-Anzeigen können eingeblendet werden, wenn Nutzer Ihre App in den Vordergrund holen.
Bei App-Start-Anzeigen ist automatisch das Branding Ihrer App zu sehen, damit die Nutzer wissen, dass sie sich in Ihrer App befinden. Hier ist ein Beispiel für eine App-Start-Anzeige:
Hier finden Sie eine allgemeine Beschreibung der Implementierung von App-Start-Anzeigen:
- Erstellen Sie eine Manager-Klasse, die eine Anzeige lädt, bevor Sie sie präsentieren müssen.
- Anzeigen der Anzeige während der Ereignisse im Vordergrund der App.
- Präsentations-Callbacks verarbeiten
Vorbereitung
- Folgen Sie der Einrichtungsanleitung in unserem Leitfaden für den Einstieg.
- Sie wissen, wie Sie Ihr Gerät als Testgerät konfigurieren.
Immer Testanzeigen verwenden
Verwenden Sie beim Entwickeln und Testen Ihrer Apps Testanzeigen anstelle von Live-Anzeigen. Andernfalls kann es zu einer Kontosperrung kommen.
Testanzeigen lassen sich am einfachsten laden, wenn Sie unsere spezielle Test-Anzeigenblock-ID für App-Open-Anzeigen verwenden:
ca-app-pub-3940256099942544/5575463023
Sie ist speziell dafür konfiguriert, für jede Anfrage Testanzeigen zurückzugeben. Sie können sie also beim Programmieren, Testen und Debuggen in Ihren eigenen Apps verwenden. Denken Sie daran, sie vor der Veröffentlichung Ihrer App durch Ihre eigene Anzeigenblock-ID zu ersetzen.
Weitere Informationen zur Funktionsweise von Testanzeigen im Mobile Ads SDK finden Sie unter Testanzeigen.
Manager-Klasse implementieren
Ihre Anzeige sollte schnell eingeblendet werden. Laden Sie sie daher am besten, bevor Sie sie präsentieren müssen. So ist eine Anzeige verfügbar, sobald der Nutzer Ihre App aufruft. Implementieren Sie eine Manager-Klasse, um Anzeigenanfragen vor dem Zeitpunkt zu stellen, zu dem die Anzeige ausgeliefert werden soll.
Erstellen Sie eine neue Singleton-Klasse mit dem Namen AppOpenAdManager
und füllen Sie sie wie folgt aus:
Swift
class AppOpenAdManager: NSObject {
var appOpenAd: AppOpenAd?
var isLoadingAd = false.
var isShowingAd = false
static let shared = AppOpenAdManager()
private func loadAd() async {
// TODO: Implement loading an ad.
}
func showAdIfAvailable() {
// TODO: Implement showing an ad.
}
private func isAdAvailable() -> Bool {
// Check if ad exists and can be shown.
return appOpenAd != nil
}
}
Objective-C
@interface AppOpenAdManager ()
@property(nonatomic, strong) GADAppOpenAd *appOpenAd;
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;
@end
@implementation AppOpenAdManager
+ (nonnull AppOpenAdManager *)sharedInstance {
static AppOpenAdManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[AppOpenAdManager alloc] init];
});
return instance;
}
- (void)loadAd {
// TODO: Implement loading an ad.
}
// Add this method to the .h file.
- (void)showAdIfAvailable {
// TODO: Implement showing an ad.
}
- (BOOL)isAdAvailable {
// Check if ad exists and can be shown.
return self.appOpenAd != nil;
}
@end
Anzeige laden
Im nächsten Schritt müssen Sie die loadAd()
-Methode ausfüllen.
Swift
private func loadAd() async {
// Do not load ad if there is an unused ad or one is already loading.
if isLoadingAd || isAdAvailable() {
return
}
isLoadingAd = true
do {
appOpenAd = try await AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
} catch {
print("App open ad failed to load with error: \(error.localizedDescription)")
}
isLoadingAd = false
}
Objective-C
- (void)loadAd {
// Do not load ad if there is an unused ad or one is already loading.
if (self.isLoadingAd || [self isAdAvailable]) {
return;
}
self.isLoadingAd = YES;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5575463023"
request:[GADRequest request]
completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
self.isLoadingAd = NO;
if (error) {
NSLog(@"Failed to load app open ad: %@", error);
return;
}
self.appOpenAd = appOpenAd;
}];
}
Anzeige einblenden
Im nächsten Schritt müssen Sie die showAdIfAvailable()
-Methode ausfüllen. Wenn keine Anzeige verfügbar ist, wird versucht, eine Anzeige zu laden.
Swift
func showAdIfAvailable() {
// If the app open ad is already showing, do not show the ad again.
guard !isShowingAd else { return }
// If the app open ad is not available yet but is supposed to show, load
// a new ad.
if !isAdAvailable() {
Task {
await loadAd()
}
return
}
if let ad = appOpenAd {
isShowingAd = true
ad.present(from: nil)
}
}
Objective-C
- (void)showAdIfAvailable {
// If the app open ad is already showing, do not show the ad again.
if (self.isShowingAd) {
return;
}
// If the app open ad is not available yet but is supposed to show, load a
// new ad.
if (![self isAdAvailable]) {
[self loadAd];
return;
}
self.isShowingAd = YES;
[self.appOpenAd presentFromRootViewController:nil];
}
Anzeige bei Ereignissen im Vordergrund der App einblenden
Wenn die Anwendung aktiv wird, rufen Sie showAdIfAvailable()
auf, um eine Anzeige zu präsentieren, falls eine verfügbar ist, oder eine neue zu laden.
Swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// ...
func applicationDidBecomeActive(_ application: UIApplication) {
// Show the app open ad when the app is foregrounded.
AppOpenAdManager.shared.showAdIfAvailable()
}
}
Objective-C
@implementation AppDelegate
// ...
- (void) applicationDidBecomeActive:(UIApplication *)application {
// Show the app open ad when the app is foregrounded.
[AppOpenAdManager.sharedInstance showAdIfAvailable];
}
@end
Präsentations-Callbacks verarbeiten
Wenn in Ihrer App eine App-Start-Anzeige ausgeliefert wird, sollten Sie sich auf die GADFullScreenContentDelegate
verlassen, um bestimmte Präsentationsereignisse zu verarbeiten. Insbesondere sollten Sie die nächste App-Start-Anzeige anfordern, sobald die erste fertig präsentiert wurde.
Fügen Sie in Ihrer AppOpenAdManager
-Klasse Folgendes hinzu:
Swift
class AppOpenAdManager: NSObject, FullScreenContentDelegate {
// ...
private func loadAd() async {
// Do not load ad if there is an unused ad or one is already loading.
if isLoadingAd || isAdAvailable() {
return
}
isLoadingAd = true
do {
appOpenAd = try await AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
appOpenAd?.fullScreenContentDelegate = self
} catch {
print("App open ad failed to load with error: \(error.localizedDescription)")
}
isLoadingAd = false
}
// ...
// MARK: - FullScreenContentDelegate methods
func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad will be presented.")
}
func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
appOpenAd = nil
isShowingAd = false
// Reload an ad.
Task {
await loadAd()
}
}
func ad(
_ ad: FullScreenPresentingAd,
didFailToPresentFullScreenContentWithError error: Error
) {
appOpenAd = nil
isShowingAd = false
// Reload an ad.
Task {
await loadAd()
}
}
}
Objective-C
@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;
@end
@implementation AppOpenAdManager
// ...
- (void)loadAd {
// Do not load ad if there is an unused ad or one is already loading.
if (self.isLoadingAd || [self isAdAvailable]) {
return;
}
self.isLoadingAd = YES;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5575463023"
request:[GADRequest request]
completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
self.isLoadingAd = NO;
if (error) {
NSLog(@"Failed to load app open ad: %@", error);
return;
}
self.appOpenAd = appOpenAd;
self.appOpenAd.fullScreenContentDelegate = self;
}];
}
- (BOOL)isAdAvailable {
// Check if ad exists and can be shown.
return self.appOpenAd != nil;
}
// ...
#pragma mark - GADFullScreenContentDelegate methods
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"App open ad is will be presented.");
}
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
self.appOpenAd = nil;
self.isShowingAd = NO;
// Reload an ad.
[self loadAd];
}
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
self.appOpenAd = nil;
self.isShowingAd = NO;
// Reload an ad.
[self loadAd];
}
@end
Ablauf von Anzeigen berücksichtigen
Damit keine abgelaufene Anzeige ausgeliefert wird, können Sie dem App-Delegate eine Methode hinzufügen, die die seit dem Laden der Anzeigenreferenz vergangene Zeit prüft.
Fügen Sie in Ihrem AppOpenAdManager
das Attribut Date
mit dem Namen loadTime
hinzu und legen Sie es beim Laden Ihrer Anzeige fest. Anschließend können Sie eine Methode hinzufügen, die true
zurückgibt, wenn seit dem Laden Ihrer Anzeige weniger als eine bestimmte Anzahl von Stunden vergangen ist. Prüfen Sie die Gültigkeit des Anzeigenverweises, bevor Sie versuchen, die Anzeige auszuliefern.
Swift
class AppOpenAdManager: NSObject, FullScreenContentDelegate {
var appOpenAd: AppOpenAd?
var isLoadingAd = false.
var isShowingAd = false
var loadTime: Date?
let fourHoursInSeconds = TimeInterval(3600 * 4)
// ...
private func loadAd() async {
// Do not load ad if there is an unused ad or one is already loading.
if isLoadingAd || isAdAvailable() {
return
}
isLoadingAd = true
do {
appOpenAd = try await AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
appOpenAd?.fullScreenContentDelegate = self
loadTime = Date()
} catch {
print("App open ad failed to load with error: \(error.localizedDescription)")
}
isLoadingAd = false
}
private func wasLoadTimeLessThanFourHoursAgo() -> Bool {
guard let loadTime = loadTime else { return false }
// Check if ad was loaded more than four hours ago.
return Date().timeIntervalSince(loadTime) < fourHoursInSeconds
}
private func isAdAvailable() -> Bool {
// Check if ad exists and can be shown.
return appOpenAd != nil && wasLoadTimeLessThanFourHoursAgo()
}
}
Objective-C
static NSTimeInterval const fourHoursInSeconds = 3600 * 4;
@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;
@property(weak, nonatomic) NSDate *loadTime;
@end
@implementation AppOpenAdManager
// ...
- (void)loadAd {
// Do not load ad if there is an unused ad or one is already loading.
if (self.isLoadingAd || [self isAdAvailable]) {
return;
}
self.isLoadingAd = YES;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5575463023"
request:[GADRequest request]
completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
self.isLoadingAd = NO;
if (error) {
NSLog(@"Failed to load app open ad: %@", error);
return;
}
self.appOpenAd = appOpenAd;
self.appOpenAd.fullScreenContentDelegate = self;
self.loadTime = [NSDate date];
}];
}
- (BOOL)wasLoadTimeLessThanFourHoursAgo {
// Check if ad was loaded more than four hours ago.
return [[NSDate Date] timeIntervalSinceDate:self.loadTime] < fourHoursInSeconds;
}
- (BOOL)isAdAvailable {
// Check if ad exists and can be shown.
return self.appOpenAd != nil && [self wasLoadTimeLessThanFourHoursAgo];
}
@end
Kaltstarts und Ladebildschirme
In der Dokumentation wird davon ausgegangen, dass Sie App-Start-Anzeigen nur einblenden, wenn Nutzer Ihre App in den Vordergrund holen, nachdem sie im Arbeitsspeicher angehalten wurde. Von einem „Kaltstart“ spricht man, wenn Ihre App gestartet wird, aber nicht zuvor im Arbeitsspeicher angehalten wurde.
Ein Beispiel für einen Kaltstart ist, wenn ein Nutzer Ihre App zum ersten Mal öffnet. Bei Kaltstarts ist keine zuvor geladene App-Start-Anzeige verfügbar, die sofort ausgeliefert werden kann. Die Verzögerung zwischen dem Anfordern einer Anzeige und dem Erhalt einer Anzeige kann dazu führen, dass Nutzer Ihre App kurzzeitig verwenden können, bevor sie von einer Anzeige überrascht werden, die nicht zum Kontext passt. Dies sollte vermieden werden, da es zu einer schlechten Nutzererfahrung führt.
Die bevorzugte Methode für App-Start-Anzeigen bei Kaltstarts ist die Verwendung eines Ladebildschirms zum Laden der Assets Ihres Spiels oder Ihrer App. Die Anzeige wird dann nur auf dem Ladebildschirm eingeblendet. Wenn Ihre App vollständig geladen wurde und der Nutzer zum Hauptinhalt Ihrer App weitergeleitet wurde, darf die Anzeige nicht ausgeliefert werden.
Best Practices
Google hat App-Start-Anzeigen entwickelt, damit Sie den Ladebildschirm Ihrer App monetarisieren können. Es ist jedoch wichtig, Best Practices zu beachten, damit Ihre Nutzer Ihre App gerne verwenden. Achten Sie auf Folgendes:
- Blenden Sie die erste App-Start-Anzeige erst ein, nachdem die Nutzer Ihre App einige Male verwendet haben.
- Blenden Sie App-Start-Anzeigen ein, wenn Ihre Nutzer ansonsten darauf warten müssten, dass Ihre App geladen wird.
- Wenn sich die App-Start-Anzeige auf einem Ladebildschirm befindet und der Ladevorgang abgeschlossen ist, bevor die Anzeige beendet wird, können Sie den Ladebildschirm mit der Methode
adDidDismissFullScreenContent
beenden.
Vollständiges Beispiel auf GitHub
Nächste Schritte
Weitere Informationen zum Datenschutz