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 faça testes com anúncios de teste
Ao criar e testar seus apps, use anúncios de teste em vez de anúncios de produção ativos. Sua conta poderá ser suspensa se isso não for feito.
A maneira mais fácil de carregar anúncios de teste é usar nosso ID de bloco de anúncios de teste dedicado para iOS anúncios premiados:
ca-app-pub-3940256099942544/1712485313
Ele foi configurado especialmente para retornar anúncios de teste para todas as solicitações, e você sem custos para usá-lo nos seus próprios apps durante a programação, o teste e a depuração. Apenas faça lembre-se de substituí-lo pelo seu próprio ID do bloco de anúncios antes de publicar o aplicativo.
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
Confira a seguir as principais etapas para integrar os anúncios premiados:
- Carregar um anúncio
- [Opcional] Valide os 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 a 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)
Apps que exigem dados extras no lado do servidor
callbacks de verificação devem usar o método
recurso de dados personalizados dos anúncios premiados. Qualquer valor de string definido em um anúncio premiado
é transmitido ao parâmetro de consulta custom_data
do callback SSV. Em caso negativo
valor de dados personalizado estiver definido, o valor do parâmetro de consulta custom_data
não será
presentes no retorno de chamada 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-se para callbacks
Para receber notificações de eventos de apresentação, você deve implementar
o protocolo GADFullScreenContentDelegate
e atribuí-lo à
fullScreenContentDelegate
do anúncio retornado. O
o protocolo GADFullScreenContentDelegate
processa callbacks para quando o anúncio
apresenta com sucesso ou não 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, assim que um anúncio premiado for
mostrado, ele não pode ser mostrado novamente. Uma prática recomendada é carregar outro anúncio premiado
no método adDidDismissFullScreenContent:
da GADFullScreenContentDelegate
para que o próximo anúncio premiado comece a carregar assim que o anterior for
dispensada.
Exiba o anúncio e processe o evento de recompensa.
Antes de exibir um anúncio premiado, você precisa apresentar a eles escolha explícita de visualizar o conteúdo do anúncio premiado em troca de uma recompensa. Premiado os anúncios devem sempre ser 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
Ouça eventos de interface na visualização 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 do callback
userDidEarnReward
for acionado,GADRewardedAd
tem umadReward
que pode ser verificada para verificar o valor da recompensa após o carregamento do anúncio. - Há 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 aostartWithCompletionHandler:
, mesmo que uma rede de mediação concluir 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
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. Então, se uma rede de mediação termina a inicialização após o tempo limite, ela ainda pode atender futuras solicitações de anúncios na sessão.Você pode continuar a consultar o status de inicialização de todos os adaptadores a sessão do app chamando
GADMobileAds.initializationStatus
.- Como faço para descobrir por que uma determinada rede de mediação não está pronta?
A propriedade
description
de um objetoGADAdapterStatus
descreve por que uma 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 de
userDidEarnRewardHandler
ocorrem antes deadDidDismissFullScreenContent:
. Para anúncios veiculados por mediação, a rede de publicidade de terceiros A implementação do SDK determina a ordem do callback. Para SDKs de redes de publicidade que forneça um único método delegado com informações sobre o prêmio, o adaptador de mediação invocauserDidEarnRewardHandler
antes deadDidDismissFullScreenContent:
.
Exemplos no GitHub
Confira os exemplos completos de anúncios premiados no idioma de sua preferência:
Próximas etapas
Saiba mais sobre a privacidade do usuário.