Annonces avec récompense

Les annonces avec récompense sont des annonces avec lesquelles les utilisateurs ont la possibilité d'interagir en échange. pour obtenir des récompenses dans l'application. Ce guide vous explique comment intégrer des annonces avec récompense AdMob dans une application iOS. Lisez quelques histoires de réussite client : étude de cas 1, étude de cas 2.

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 tests dédié pour les annonces avec récompense iOS :

ca-app-pub-3940256099942544/1712485313

Il a été spécialement configuré pour renvoyer des annonces tests pour chaque demande. de l'utiliser dans vos propres applications lors du codage, des tests et du débogage. Il suffit de créer remplacez-le 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 la section Annonces :

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
  • S'inscrire pour recevoir des rappels
  • Afficher l'annonce et gérer l'événement lié à la récompense

Charger une annonce

Le chargement d'une annonce s'effectue à l'aide de la méthode load(adUnitID:request) sur la classe GADRewardedAd.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
    } catch {
      print("Rewarded ad failed to load with error: \(error.localizedDescription)")
    }
  }
}

SwiftUI

import GoogleMobileAds

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

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

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GADRequest *request = [GADRequest request];
  [GADRewardedAd
      loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
      }];
}

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

Applications nécessitant des données supplémentaires côté serveur vérification doivent utiliser la méthode personnalisée des annonces avec récompense. Toute valeur de chaîne définie sur une annonce avec récompense est transmis au paramètre de requête custom_data du rappel SSV. Si non la valeur des données personnalisées est définie, la valeur du paramètre de requête custom_data ne sera pas présentes dans le rappel SSV.

L'exemple de code suivant montre comment définir des données personnalisées dans une annonce avec récompense. avant de demander une annonce.

Swift

do {
  rewardedAd = try await GADRewardedAd.load(
    withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
  let options = GADServerSideVerificationOptions()
  options.customRewardString = "SAMPLE_CUSTOM_DATA_STRING"
  rewardedAd.serverSideVerificationOptions = options
} catch {
  print("Rewarded ad failed to load with error: \(error.localizedDescription)")
}

Objective-C

[GADRewardedAd
     loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:[GADRequest request];
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        // Handle Error
        return;
      }
      self.rewardedAd = ad;
      GADServerSideVerificationOptions *options =
          [[GADServerSideVerificationOptions alloc] init];
      options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
      ad.serverSideVerificationOptions = options;
    }];

S'inscrire pour recevoir des rappels

Pour recevoir des notifications pour les événements de présentation, vous devez implémenter le protocole GADFullScreenContentDelegate et l'attribuer à la propriété fullScreenContentDelegate de l'annonce renvoyée. La Le protocole GADFullScreenContentDelegate gère les rappels lorsque l'annonce présente correctement ou non, et lorsqu'elle est ignorée. Les éléments suivants : indique comment implémenter le protocole et l'attribuer à l'annonce:

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() async {
    do {
      rewardedAd = try await GADRewardedAd.load(
        withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Rewarded ad failed to load 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

Attribuez la propriété fullScreenContentDelegate à l'annonce renvoyée:

rewardedAd?.fullScreenContentDelegate = self

Implémentez le protocole:

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 rewarded ad.
  rewardedAd = nil
}

Objective-C

@interface ViewController () <GADFullScreenContentDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GADRequest *request = [GADRequest request];
  [GADRewardedAd
      loadWithAdUnitID:@"ca-app-pub-3940256099942544/4806952744"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
        self.rewardedAd.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.");
}

GADRewardedAd est un objet à usage unique. Cela signifie qu'une fois qu'une annonce avec récompense ne peut pas être affichée à nouveau. Il est recommandé de charger une autre annonce avec récompense dans la méthode adDidDismissFullScreenContent: sur GADFullScreenContentDelegate afin que la prochaine annonce avec récompense commence à se charger dès que la précédente est fermée.

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

Avant de diffuser une annonce avec récompense, vous devez présenter à l'utilisateur choix explicite de regarder le contenu d'une annonce avec récompense en échange d'une récompense Les annonces avec récompense doivent toujours être activées.

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 diffuser une annonce avec récompense.

Swift

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

  // The UIViewController parameter is an optional.
  ad.present(fromRootViewController: nil) {
    let reward = ad.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 diffuser 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 ViewModel:

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

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

Objective-C

- (void)show {
  if (self.rewardedAd) {
    // The UIViewController parameter is nullable.
    [self.rewardedAd presentFromRootViewController:nil
                                  userDidEarnRewardHandler:^{
                                  GADAdReward *reward =
                                      self.rewardedAd.adReward;
                                  // TODO: Reward the user!
                                }];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

Questions fréquentes

Puis-je obtenir les détails de la récompense GADRewardedAd ?
Oui, si vous avez besoin du montant de la récompense avant le rappel userDidEarnReward est déclenchée, GADRewardedAd a une adReward que vous pouvez consulter pour vérifier le montant de la récompense une fois l'annonce chargée.
Existe-t-il un délai avant expiration pour l'appel d'initialisation ?
Au bout de 10 secondes, le SDK Google Mobile Ads 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 faire 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 à l'intérieur de GADInitializationCompletionHandler Même si un réseau de médiation n'est pas prêt, le SDK Google Mobile Ads demande toujours une annonce à ce réseau. Donc, si un l'initialisation du réseau de médiation est terminée après expiration du délai d'inactivité. les futures demandes d'annonces au cours de cette session.

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

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

La propriété description d'un objet GADAdapterStatus décrit la raison pour laquelle l'adaptateur n'est pas prêt à traiter les 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 le adDidDismissFullScreenContent:. Pour les annonces diffusées via médiation, le réseau publicitaire tiers L'implémentation du SDK détermine l'ordre de rappel. Pour les SDK de réseaux publicitaires fournir une méthode de délégation unique avec les informations sur les récompenses, l'adaptateur de médiation appelle userDidEarnRewardHandler avant adDidDismissFullScreenContent:.

Exemples sur GitHub

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

Étapes suivantes

En savoir plus sur la confidentialité des utilisateurs