Annonces avec récompense

Sélectionnez une plate-forme : Android iOS Unity Flutter Android (ancien)

Les annonces avec récompense sont des annonces avec lesquelles les utilisateurs peuvent choisir d'interagir en échange de récompenses dans l'application. Ce guide vous explique comment intégrer des annonces avec récompense AdMob dans une application iOS. Consultez quelques témoignages de clients : étude de cas 1, étude de cas 2.

Prérequis

Avant de continuer, configurez Google Mobile Ads SDK.

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 de test consiste à utiliser l'ID de bloc d'annonces de test dédié aux annonces avec récompense iOS :

ca-app-pub-3940256099942544/1712485313

Il a été spécialement configuré pour renvoyer des annonces tests pour chaque demande. 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 Google Mobile Ads SDK, consultez Annonces tests.

Implémentation

Voici les principales étapes à suivre pour intégrer des annonces avec récompense :

  • Charger une annonce
  • [Facultatif] Valider les rappels de validation côté serveur
  • Demander à recevoir les rappels
  • Afficher l'annonce et gérer l'événement de récompense

Charger une annonce

Pour charger une annonce, la méthode load(adUnitID:request) doit être utilisée sur la classe GADRewardedAd.

Swift

func loadRewardedAd() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    rewardedAd?.fullScreenContentDelegate = self
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

SwiftUI

import GoogleMobileAds

class RewardedViewModel: NSObject, ObservableObject, FullScreenContentDelegate {
  @Published var coins = 0
  private var rewardedAd: RewardedAd?

  func loadAd() async {
    do {
      rewardedAd = try await RewardedAd.load(
        with: "ca-app-pub-3940256099942544/1712485313", request: Request())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Failed to load rewarded ad with error: \(error.localizedDescription)")
    }
  }

Objective-C

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:[GADRequest request]
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
        return;
      }
      self.rewardedAd = ad;
      self.rewardedAd.fullScreenContentDelegate = self;
    }];

[Facultatif] Valider les rappels de validation côté serveur (SSV)

Les applications qui nécessitent des données supplémentaires dans les rappels de validation côté serveur doivent utiliser la fonctionnalité de données personnalisées des annonces avec récompense. Toute valeur de chaîne définie sur un objet d'annonce avec récompense est transmise au paramètre de requête custom_data du rappel de validation côté serveur. Si aucune valeur de données personnalisée n'est définie, la valeur du paramètre de requête custom_data ne sera pas présente dans le rappel SSV.

L'exemple de code suivant montre comment définir des données personnalisées sur un objet d'annonce avec récompense avant de demander une annonce :

Swift

private func validateServerSideVerification() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    let options = ServerSideVerificationOptions()
    options.customRewardText = "SAMPLE_CUSTOM_DATA_STRING"
    rewardedAd?.serverSideVerificationOptions = options
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

Objective-C

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                        request:[GADRequest request]
              completionHandler:^(GADRewardedAd *ad, NSError *error) {
                if (error) {
                  NSLog(@"Rewarded ad failed to load with error: %@", error.localizedDescription);
                  return;
                }
                self.rewardedAd = ad;
                GADServerSideVerificationOptions *options =
                    [[GADServerSideVerificationOptions alloc] init];
                options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
                ad.serverSideVerificationOptions = options;
              }];

Remplacez SAMPLE_CUSTOM_DATA_STRING par vos données personnalisées.

Demander à recevoir les rappels

Pour recevoir des notifications d'événements de présentation, vous devez attribuer le GADFullScreenContentDelegate à la propriété fullScreenContentDelegate de l'annonce renvoyée :

Swift

rewardedAd?.fullScreenContentDelegate = self

SwiftUI

rewardedAd?.fullScreenContentDelegate = self

Objective-C

self.rewardedAd.fullScreenContentDelegate = self;

Le protocole GADFullScreenContentDelegate gère les rappels lorsque l'annonce s'affiche correctement ou non, et lorsqu'elle est fermée. Le code suivant montre comment implémenter le protocole :

Swift

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
  // Clear the rewarded ad.
  rewardedAd = nil
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called with error: \(error.localizedDescription).")
}

SwiftUI

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
  // Clear the rewarded ad.
  rewardedAd = nil
}

Objective-C

- (void)adDidRecordImpression:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidRecordClick:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillPresentFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
  // Clear the rewarded ad.
  self.rewardedAd = nil;
}

- (void)ad:(id)ad didFailToPresentFullScreenContentWithError:(NSError *)error {
  NSLog(@"%s called with error: %@", __PRETTY_FUNCTION__, error.localizedDescription);
}

Afficher l'annonce et gérer l'événement de récompense

Avant de diffuser une annonce avec récompense, vous devez proposer explicitement à l'utilisateur de visionner le contenu de l'annonce en échange d'une récompense. Les annonces avec récompense doivent toujours être activées par l'utilisateur.

Lorsque vous présentez votre annonce, vous devez fournir un objet GADUserDidEarnRewardHandler pour gérer la récompense de l'utilisateur.

Le code suivant présente la meilleure méthode pour afficher une annonce avec récompense :

Swift

rewardedAd.present(from: self) {
  let reward = rewardedAd.adReward
  print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")

  // TODO: Reward the user.
}

SwiftUI

Écoutez les événements d'interface utilisateur dans la vue pour déterminer quand afficher l'annonce.

var body: some View {
  VStack(spacing: 20) {
      Button("Watch video for additional 10 coins") {
        viewModel.showAd()
        showWatchVideoButton = false
      }

Présentez l'annonce avec récompense à partir du modèle de vue :

func showAd() {
  guard let rewardedAd = rewardedAd else {
    return print("Ad wasn't ready.")
  }

  rewardedAd.present(from: nil) {
    let reward = rewardedAd.adReward
    print("Reward amount: \(reward.amount)")
    self.addCoins(reward.amount.intValue)
  }
}

Objective-C

[self.rewardedAd presentFromRootViewController:self
                      userDidEarnRewardHandler:^{
                        GADAdReward *reward = self.rewardedAd.adReward;
                        NSString *rewardMessage = [NSString
                            stringWithFormat:@"Reward received with currency %@ , amount %lf",
                                             reward.type, [reward.amount doubleValue]];
                        NSLog(@"%@", rewardMessage);

                        // TODO: Reward the user.
                      }];

Questions fréquentes

Puis-je obtenir les détails de la récompense pour le GADRewardedAd ?
Oui, si vous avez besoin du montant de la récompense avant que le rappel userDidEarnReward ne soit déclenché, GADRewardedAd dispose d'une propriété adReward que vous pouvez consulter pour vérifier le montant de la récompense une fois l'annonce chargée.
L'appel d'initialisation est-il soumis à un délai avant expiration ?
Au bout de 10 secondes, Google Mobile Ads SDK appelle le GADInitializationCompletionHandler fourni à la méthode startWithCompletionHandler:, même si un réseau de médiation n'a pas encore terminé l'initialisation.
Que se passe-t-il si certains réseaux de médiation ne sont pas prêts lorsque je reçois le rappel d'initialisation ?

Nous vous recommandons de charger une annonce dans GADInitializationCompletionHandler. Même si un réseau de médiation n'est pas prêt, Google Mobile Ads SDK lui demande quand même une annonce. Ainsi, si un réseau de médiation termine l'initialisation après l'expiration du délai, il peut toujours répondre aux futures demandes d'annonces de cette session.

Vous pouvez continuer à interroger l'état d'initialisation de tous les adaptateurs tout au long de la session de votre application en appelant GADMobileAds.initializationStatus.

Comment savoir pourquoi un réseau de médiation particulier n'est pas prêt ?

La propriété description d'un objet GADAdapterStatus indique pourquoi un adaptateur n'est pas prêt à diffuser des demandes d'annonces.

Le gestionnaire d'achèvement userDidEarnRewardHandler est-il toujours appelé avant la méthode déléguée adDidDismissFullScreenContent: ?

Pour les annonces Google, tous les appels userDidEarnRewardHandler ont lieu avant adDidDismissFullScreenContent:. Pour les annonces diffusées via la médiation, l'implémentation du SDK du réseau publicitaire tiers détermine l'ordre des rappels. Pour les SDK de réseaux publicitaires qui fournissent une seule méthode de délégué avec des informations sur la récompense, l'adaptateur de médiation appelle userDidEarnRewardHandler avant adDidDismissFullScreenContent:.

Exemples sur GitHub

Consultez les exemples complets d'annonces avec récompense dans la langue de votre choix :

Étapes suivantes

En savoir plus sur la confidentialité des utilisateurs