Les utilisateurs ont la possibilité d'interagir avec ce type d'annonces en échange d'une récompense dans une application. Ce guide vous explique comment intégrer des annonces avec récompenses depuis Ad Manager dans une application iOS.
Prérequis
- SDK Google Mobile Ads 8.0.0 ou version ultérieure
- Suivez le guide de démarrage.
Effectuez toujours des tests 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:
/21775744923/example/rewarded
Il a été spécialement configuré pour renvoyer des annonces de test 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é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 des 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
import GoogleMobileAds
import UIKit
class ViewController: UIViewController {
private var rewardedAd: GADRewardedAd?
func loadRewardedAd() async {
do {
rewardedAd = try await GADRewardedAd.load(
withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
} 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 {
GAMRequest *request = [GAMRequest request];
[GADRewardedAd
loadWithAdUnitID:@"/21775744923/example/rewarded"
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
Les applications qui nécessitent des données supplémentaires dans les rappels de vérification 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 SSV. Si aucune valeur de données personnalisées 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
do {
rewardedAd = try await GADRewardedAd.load(
withAdUnitID: "/21775744923/example/rewarded", request: GAMRequest())
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:@"/21775744923/example/rewarded"
request:[GAMRequest 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;
}];
Demander à 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. Le protocole GADFullScreenContentDelegate
gère les rappels lorsque la présentation de l'annonce aboutit ou échoue, et lorsqu'elle est ignorée. Le code suivant montre 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: "/21775744923/example/rewarded", request: GAMRequest())
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 {
GAMRequest *request = [GAMRequest 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 est diffusée, elle ne peut plus l'être à 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 auprès des utilisateurs, vous devez leur donner la possibilité explicite de regarder le contenu de l'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 pour l'utilisateur.
Le code suivant présente la meilleure méthode pour afficher 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 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(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 pour le
GADRewardedAd
? - Oui. Si vous avez besoin du montant de la récompense avant le déclenchement du rappel
userDidEarnReward
,GADRewardedAd
dispose d'une propriétéadReward
que vous pouvez vérifier pour vérifier le montant de la récompense après le chargement de l'annonce. - L'appel d'initialisation est-il soumis à un délai avant expiration ?
- Au bout de 10 secondes, le SDK Google Mobile Ads appelle le
GADInitializationCompletionHandler
fourni à la méthodestartWithCompletionHandler:
, 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, le SDK Google Mobile Ads demande toujours une annonce à ce réseau. Par conséquent, si un réseau de médiation termine son initialisation après le délai avant expiration, il peut toujours traiter les futures demandes d'annonces 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 particulier n'est pas prêt ?
La propriété
description
d'un objetGADAdapterStatus
décrit pourquoi un adaptateur n'est pas prêt à traiter les requêtes d'annonces.- Le gestionnaire d'achèvement
userDidEarnRewardHandler
est-il toujours appelé avant la méthode déléguéeadDidDismissFullScreenContent:
? Pour les annonces Google, tous les appels
userDidEarnRewardHandler
se produisent avantadDidDismissFullScreenContent:
. Pour les annonces diffusées via la médiation, l'ordre des rappels est déterminé par l'implémentation du SDK du réseau publicitaire tiers. Pour les SDK de réseaux publicitaires qui fournissent une seule méthode de délégué avec des informations sur les récompenses, l'adaptateur de médiation appelleuserDidEarnRewardHandler
avantadDidDismissFullScreenContent:
.
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