Gli annunci con premio sono annunci con cui gli utenti possono scegliere di interagire in cambio di premi in-app. Questa guida illustra come integrare gli annunci con premio di AdMob in un'app per iOS. Leggi alcuni casi di successo dei clienti: case study 1, case study 2.
Prerequisiti
- SDK Google Mobile Ads 8.0.0 o versioni successive.
- Completa la Guida introduttiva.
Effettua sempre test con annunci di prova
Quando crei e testi le tue app, assicurati di utilizzare annunci di prova anziché annunci pubblicati in produzione. In caso contrario, l'account verrà sospeso.
Il modo più semplice per caricare gli annunci di prova è utilizzare il nostro ID unità pubblicitaria di prova dedicato per gli annunci con premio per iOS:
ca-app-pub-3940256099942544/1712485313
È stato appositamente configurato per restituire annunci di prova per ogni richiesta e puoi utilizzarlo nelle tue app durante la programmazione, i test e il debug. Assicurati solo di sostituirlo con il tuo ID unità pubblicitaria prima di pubblicare l'app.
Per ulteriori informazioni sul funzionamento degli annunci di prova dell'SDK Mobile Ads, consulta la pagina Annunci di prova.
Implementazione
Di seguito sono riportati i passaggi principali per integrare gli annunci con premio:
- Carica un annuncio
- [Facoltativo] Convalida i callback SSV
- Registrati per i callback
- Mostrare l'annuncio e gestire l'evento con premio
Carica un annuncio
Il caricamento di un annuncio viene eseguito utilizzando il metodo load(adUnitID:request)
della 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.");
}];
}
[Facoltativo] Convalida i callback della verifica lato server
Le app che richiedono dati aggiuntivi nei callback della verifica lato server devono utilizzare la funzionalità dei dati personalizzati degli annunci con premio. Qualsiasi valore di stringa impostato su un oggetto annuncio con premio viene passato al parametro di query custom_data
del callback SSV. Se non viene impostato
un valore dei dati personalizzati, il valore del parametro di query custom_data
non sarà
presente nel callback SSV.
Il seguente esempio di codice mostra come impostare i dati personalizzati su un oggetto annuncio con premio prima di richiedere un annuncio.
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;
}];
Registrati per i callback
Per ricevere notifiche per gli eventi di visualizzazione, devi implementare il protocollo GADFullScreenContentDelegate
e assegnarlo alla proprietà fullScreenContentDelegate
dell'annuncio restituito. Il protocolloGADFullScreenContentDelegate
gestisce i callback per quando l'annuncio viene visualizzato correttamente o meno e quando viene ignorato. Il seguente
codice mostra come implementare il protocollo e assegnarlo all'annuncio:
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
Assegna la proprietà fullScreenContentDelegate
all'annuncio restituito:
rewardedAd?.fullScreenContentDelegate = self
Implementa il protocollo:
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
è un oggetto monouso. Ciò significa che, una volta visualizzato, un annuncio con premio non può essere mostrato di nuovo. Una best practice consiste nel caricare un altro annuncio con premio
nel metodo adDidDismissFullScreenContent:
su GADFullScreenContentDelegate
in modo che l'annuncio con premio successivo inizi a caricarsi non appena quello precedente viene chiuso.
Mostrare l'annuncio e gestire l'evento con premio
Prima di mostrare agli utenti un annuncio con premio, devi presentare una scelta esplicita per visualizzare i contenuti dell'annuncio con premio in cambio di un premio. Gli annunci con premio devono sempre essere un'esperienza basata su attivazione.
Quando presenti il tuo annuncio, devi fornire un oggetto GADUserDidEarnRewardHandler
per gestire il premio per l'utente.
Il seguente codice presenta il metodo migliore per visualizzare un annuncio con premio.
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
Ascolta gli eventi dell'interfaccia utente nella visualizzazione per determinare quando mostrare l'annuncio.
var body: some View {
VStack(spacing: 20) {
Button("Watch video for additional 10 coins") {
viewModel.showAd()
showWatchVideoButton = false
}
Presenta l'annuncio con premio dal modello di visualizzazione:
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");
}
}
Domande frequenti
- Posso avere i dettagli del premio per
GADRewardedAd
? - Sì, se hai bisogno dell'importo del premio prima dell'attivazione del callback
userDidEarnReward
,GADRewardedAd
ha una proprietàadReward
che puoi controllare per verificare l'importo del premio dopo il caricamento dell'annuncio. - Esiste un timeout per la chiamata di inizializzazione?
- Dopo 10 secondi, l'SDK Google Mobile Ads invoca il valore
GADInitializationCompletionHandler
fornito al metodostartWithCompletionHandler:
, anche se una rete di mediazione non ha ancora completato l'inizializzazione. - Cosa succede se alcune reti di mediazione non sono pronte quando ricevo il callback di inizializzazione?
Ti consigliamo di caricare un annuncio all'interno di
GADInitializationCompletionHandler
. Anche se una rete di mediazione non è pronta, l'SDK Google Mobile Ads richiede comunque un annuncio a quella rete. Pertanto, se una rete di mediazione termina l'inizializzazione dopo il timeout, può comunque gestire le richieste di annunci future nella sessione.Puoi continuare a eseguire il polling dello stato di inizializzazione di tutti gli adattatori durante la sessione dell'app chiamando
GADMobileAds.initializationStatus
.- Come faccio a sapere perché una determinata rete di mediazione non è pronta?
La proprietà
description
di un oggettoGADAdapterStatus
descrive il motivo per cui un adattatore non è pronto a gestire le richieste di annunci.- Il gestore di completamento
userDidEarnRewardHandler
viene sempre chiamato prima del metodo del delegatoadDidDismissFullScreenContent:
? Per Google Ads, tutte le chiamate
userDidEarnRewardHandler
avvengono prima del giornoadDidDismissFullScreenContent:
. Per gli annunci pubblicati tramite la mediazione, l'ordine dei callback è determinato dall'implementazione dell'SDK della rete pubblicitaria di terze parti. Per gli SDK della rete pubblicitaria che forniscono un singolo metodo delegato con informazioni sui premi, l'adattatore di mediazione invocauserDidEarnRewardHandler
prima diadDidDismissFullScreenContent:
.
Esempi su GitHub
Visualizza gli esempi completi degli annunci con premio nella tua lingua preferita:
Passaggi successivi
Scopri di più sulla privacy degli utenti.