Os anúncios premiados são aqueles com que os usuários podem interagir em troca de recompensas no app. Este guia mostra como integrar anúncios premiados da AdMob a um app iOS. Leia alguns cases de sucesso de clientes: estudo de caso 1, estudo de caso 2.
Pré-requisitos
- SDK dos anúncios para dispositivos móveis do Google 8.0.0 ou mais recente.
- Leia o Guia explicativo.
Sempre teste com anúncios de teste
Ao criar e testar seus apps, use anúncios de teste em vez de publicidade de produção ativa. Sua conta poderá ser suspensa se isso não for feito.
A maneira mais fácil de carregar anúncios de teste é usar o ID do bloco de anúncios de teste dedicado para anúncios premiados do iOS:
ca-app-pub-3940256099942544/1712485313
Ele foi configurado especialmente para retornar anúncios de teste para cada solicitação, e você pode usá-lo nos seus próprios apps durante a programação, o teste e a depuração. Só não se esqueça de substituí-lo pelo seu ID de bloco de anúncios antes de publicar o app.
Para mais informações sobre como os anúncios de teste do SDK para dispositivos móveis funcionam, consulte Anúncios de teste.
Implementação
As principais etapas para integrar anúncios premiados são as seguintes:
- Carregar um anúncio
- [Opcional] Validar callbacks de SSV
- Registrar callbacks
- Mostrar o anúncio e processar o evento de recompensa
Carregar um anúncio
É possível carregar um anúncio usando o método load(adUnitID:request)
na 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.");
}];
}
[Opcional] Validar os callbacks de verificação do lado do servidor (SSV)
Os apps que exigem dados extras em callbacks de verificação
do servidor precisam usar o
recurso de dados personalizados dos anúncios premiados. Qualquer valor de string definido em um objeto de anúncio
premiado é transmitido para o parâmetro de consulta custom_data
do callback de SSV. Se nenhum
valor de dados personalizado for definido, o valor do parâmetro de consulta custom_data
não será
apresentado no callback de SSV.
O exemplo de código abaixo demonstra como definir dados personalizados em um objeto de anúncio premiado antes de solicitar um anúncio.
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;
}];
Registrar callbacks
Para receber notificações sobre eventos de apresentação, implemente
o protocolo GADFullScreenContentDelegate
e atribua-o à
propriedade fullScreenContentDelegate
do anúncio retornado. O
protocolo GADFullScreenContentDelegate
processa callbacks para quando o anúncio
é apresentado com ou sem sucesso e quando é dispensado. O código abaixo
mostra como implementar o protocolo e atribuí-lo ao anúncio:
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
Atribua a propriedade fullScreenContentDelegate
ao anúncio retornado:
rewardedAd?.fullScreenContentDelegate = self
Implemente o protocolo:
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
é um objeto de uso único. Isso significa que, uma vez que um anúncio premiado
é exibido, não pode ser mostrado novamente. Uma prática recomendada é carregar outro anúncio premiado no método adDidDismissFullScreenContent:
em GADFullScreenContentDelegate
para que o próximo anúncio premiado comece a ser carregado assim que o anterior for dispensado.
Mostrar o anúncio e processar o evento de recompensa
Antes de mostrar um anúncio premiado aos usuários, é necessário apresentar uma opção explícita para que eles assistam o conteúdo do anúncio premiado em troca de uma recompensa. Os anúncios premiados precisam ser sempre uma experiência opcional.
Ao apresentar seu anúncio, forneça um objeto GADUserDidEarnRewardHandler
para processar a recompensa do usuário.
O código a seguir apresenta o melhor método para exibir um anúncio premiado.
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
Detecte eventos da interface no visualizador para determinar quando mostrar o anúncio.
var body: some View {
VStack(spacing: 20) {
Button("Watch video for additional 10 coins") {
viewModel.showAd()
showWatchVideoButton = false
}
Apresente o anúncio premiado do modelo de visualização:
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");
}
}
Perguntas frequentes
- Posso saber os detalhes da recompensa do
GADRewardedAd
? - Sim, se você precisar do valor da recompensa antes que o callback
userDidEarnReward
seja acionado, oGADRewardedAd
tem uma propriedadeadReward
que pode ser verificada para verificar o valor da recompensa depois que o anúncio for carregado. - Existe um tempo limite para a chamada de inicialização?
- Depois de 10 segundos, o SDK dos anúncios para dispositivos móveis do Google invoca o
GADInitializationCompletionHandler
fornecido ao métodostartWithCompletionHandler:
, mesmo que uma rede de mediação ainda não tenha concluído a inicialização. - E se algumas redes de mediação não estiverem prontas quando eu receber o callback de inicialização?
Recomendamos carregar um anúncio dentro do
GADInitializationCompletionHandler
. Mesmo que uma rede de mediação não esteja pronta, o SDK dos anúncios para dispositivos móveis do Google ainda solicita um anúncio a essa rede. Portanto, se uma rede de mediação terminar a inicialização após o tempo limite, ela ainda poderá atender futuras solicitações de anúncio nessa sessão.É possível continuar a consultar o status de inicialização de todos os adaptadores durante a sessão do app chamando
GADMobileAds.initializationStatus
.- Como descobrir por que uma rede de mediação específica não está pronta?
A propriedade
description
de um objetoGADAdapterStatus
descreve por que um adaptador não está pronto para atender às solicitações de anúncios.- O gerenciador de conclusão
userDidEarnRewardHandler
sempre é chamado antes do método delegadoadDidDismissFullScreenContent:
? Para anúncios do Google, todas as chamadas
userDidEarnRewardHandler
ocorrem antes deadDidDismissFullScreenContent:
. Para anúncios veiculados por mediação, a implementação do SDK da rede de publicidade de terceiros determina a ordem do callback. Para SDKs de rede de publicidade que oferecem um único método de delegação com informações de recompensa, o adaptador de mediação invocouuserDidEarnRewardHandler
antes deadDidDismissFullScreenContent:
.
Exemplos no GitHub
Confira os exemplos completos de anúncios premiados no seu idioma preferido:
Próximas etapas
Saiba mais sobre a privacidade do usuário.