Annonces à l'ouverture d'une application

Ce guide est destiné aux éditeurs qui intègrent des annonces à l'ouverture d'une application.

Les annonces à l'ouverture d'une application constituent un format d'annonce spécial destiné aux éditeurs qui souhaitent monétiser leurs écrans de chargement. Les utilisateurs peuvent fermer les annonces à l'ouverture d'une application à tout moment. Les annonces à l'ouverture d'une application peuvent être diffusées lorsque les utilisateurs mettent votre application au premier plan.

Les annonces à l'ouverture d'une application affichent automatiquement une petite zone de branding pour que les utilisateurs sachent qu'ils se trouvent dans votre application. Voici un exemple de ce à quoi ressemble une annonce à l'ouverture d'une application:

Dans les grandes lignes, voici les étapes requises pour intégrer des annonces à l'ouverture d'une application:

  1. Créez une classe de gestionnaire qui charge une annonce avant que vous ayez besoin de l'afficher.
  2. Afficher l'annonce pendant les événements de premier plan de l'application.
  3. Gérer les rappels de présentation.

Prérequis

Toujours tester avec des annonces tests

Lorsque vous créez et testez vos applications, assurez-vous d'utiliser des annonces tests plutôt que des annonces de production. À défaut, votre compte risque d'être suspendu.

Le moyen le plus simple de charger des annonces tests consiste à utiliser notre ID de bloc d'annonces test dédié aux annonces à l'ouverture d'une application:

/21775744923/example/app-open

Il est spécialement configuré pour renvoyer des annonces tests pour chaque requête. Vous pouvez l'utiliser dans vos propres applications lors du codage, des tests et du débogage. Veillez simplement à le remplacer par votre propre ID de bloc d'annonces avant de publier votre application.

Pour en savoir plus sur le fonctionnement des annonces tests du SDK Mobile Ads, consultez Annonces tests.

Implémenter une classe de gestionnaire

Votre annonce doit être diffusée rapidement. Il est donc préférable de la charger avant que vous ayez besoin de l'afficher. Ainsi, une annonce est prête à être diffusée dès que l'utilisateur accède à votre application. Implémentez une classe de gestionnaire pour effectuer des demandes d'annonces à l'avance au moment où vous devez diffuser l'annonce.

Créez une classe singleton appelée AppOpenAdManager et remplissez-la comme suit:

Swift

class AppOpenAdManager: NSObject {
  var appOpenAd: GADAppOpenAd?
  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

Charger une annonce

L'étape suivante consiste à renseigner la méthode loadAd().

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 GADAppOpenAd.load(
      withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
  } 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:@"/21775744923/example/app-open"
                       request:[GAMRequest 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;
             }];
}

Diffuser une annonce

L'étape suivante consiste à renseigner la méthode showAdIfAvailable(). Si aucune annonce n'est disponible, la méthode tente de la charger.

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(fromRootViewController: 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];
}

Diffuser l'annonce pendant les événements de premier plan dans l'application

Lorsque l'application devient active, appelez showAdIfAvailable() pour afficher une annonce si elle est disponible ou en charger une nouvelle.

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

Gérer les rappels de présentation

Lorsque votre application affiche une annonce à l'ouverture d'une application, vous devez utiliser GADFullScreenContentDelegate pour gérer certains événements de présentation. Plus précisément, vous devrez demander la prochaine annonce à l'ouverture de l'application une fois la première présentation terminée.

Dans la classe AppOpenAdManager, ajoutez les éléments suivants:

Swift

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  // ...

  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 GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  // ...

  // MARK: - GADFullScreenContentDelegate methods

  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("App open ad will be presented.")
  }

  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }

  func ad(
    _ ad: GADFullScreenPresentingAd,
    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:@"/21775744923/example/app-open"
                       request:[GAMRequest 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

Tenir compte de l'expiration des annonces

Pour vous assurer de ne pas diffuser une annonce arrivée à expiration, vous pouvez ajouter une méthode au délégué de l'application qui vérifie le temps écoulé depuis le chargement de votre référence d'annonce.

Dans votre AppOpenAdManager, ajoutez une propriété Date appelée loadTime et définissez-la lors du chargement de votre annonce. Vous pouvez ensuite ajouter une méthode qui renvoie true si moins d'un certain nombre d'heures se sont écoulés depuis le chargement de votre annonce. Assurez-vous de vérifier la validité de la référence de l'annonce avant d'essayer de diffuser l'annonce.

Swift

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  var appOpenAd: GADAppOpenAd?
  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 GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      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:@"/21775744923/example/app-open"
                       request:[GAMRequest 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

Démarrages à froid et écrans de chargement

La documentation part du principe que vous ne diffusez des annonces à l'ouverture que lorsque les utilisateurs font passer votre application au premier plan lorsqu'elle est suspendue en mémoire. Les "démarrages à froid" se produisent lorsque votre application est lancée, mais qu'elle n'a pas été suspendue en mémoire au préalable.

Un exemple de démarrage à froid peut se produire lorsqu'un utilisateur ouvre votre application pour la première fois. Avec les démarrages à froid, aucune annonce à l'ouverture d'une application précédemment chargée n'est prête à être diffusée immédiatement. Le laps de temps entre le moment où vous demandez une annonce et celui où vous recevez le retour d'annonce peut entraîner une brève utilisation de votre application avant que les utilisateurs ne soient surpris par une annonce hors contexte. Cela doit être évité car c'est une mauvaise expérience utilisateur.

La méthode privilégiée pour utiliser les annonces à l'ouverture d'une application lors des démarrages à froid consiste à utiliser un écran de chargement pour charger votre jeu ou vos éléments d'application, et à n'afficher l'annonce qu'à partir de cet écran. Si le chargement de votre application est terminé et qu'il a redirigé l'utilisateur vers son contenu principal, ne diffusez pas l'annonce.

Bonnes pratiques

Google a créé les annonces à l'ouverture d'une application pour vous aider à monétiser l'écran de chargement de votre application. Toutefois, il est important de garder à l'esprit les bonnes pratiques pour que vos utilisateurs apprécient l'utilisation de votre application. Assurez-vous de procéder comme suit:

  • Attendez que les utilisateurs aient utilisé votre application plusieurs fois avant de diffuser votre première annonce à l'ouverture.
  • Diffusez des annonces à l'ouverture de votre application à des moments où les utilisateurs auraient dû attendre que votre application se charge.
  • Si un écran de chargement s'affiche sous l'annonce à l'ouverture de l'application et que celui-ci se charge avant que l'annonce ne soit ignorée, vous pouvez ignorer cet écran dans la méthode adDidDismissFullScreenContent.

Exemple complet sur GitHub

Swift Objective-C

Étapes suivantes

En savoir plus sur la confidentialité des utilisateurs