Anúncios de abertura do app

Os anúncios de abertura do app são um formato especial destinado a editores que querem gerar receita com as telas de carregamento do app. Os anúncios de abertura do app podem ser fechados a qualquer momento e são criados para serem exibidos quando os usuários colocam o app em primeiro plano.

Os anúncios de abertura do app mostram automaticamente uma pequena área de branding para que os usuários saibam que estão no seu aplicativo. Confira um exemplo de anúncio de abertura do app:

Pré-requisitos

Sempre teste com anúncios de teste

O exemplo de código a seguir contém um ID de bloco de anúncios que pode ser usado para solicitar anúncios de teste. Ele foi configurado especialmente para retornar anúncios de teste em vez de anúncios de produção para cada solicitação, tornando-o seguro de uso.

No entanto, depois de registrar um app na interface da WebAd Manager e criar os próprios IDs de bloco de anúncios para uso no app, configure explicitamente seu dispositivo como um dispositivo de teste durante o desenvolvimento.

/6499/example/app-open

Implementação

As principais etapas para integrar os anúncios de abertura do app são:

  1. Criar uma classe de utilitários
  2. Carregar o anúncio de abertura do app
  3. Ouvir eventos de anúncios de abertura do app
  4. Considere a validade dos anúncios
  5. Detectar eventos de estado do app
  6. Mostrar o anúncio de abertura do app
  7. Fazer uma limpeza no anúncio de abertura do app
  8. Pré-carregue o próximo anúncio de abertura do app

Criar uma classe de utilitários

Crie uma nova classe com o nome AppOpenAdController para carregar o anúncio. Essa classe controla uma variável de instância para acompanhar um anúncio carregado e o ID do bloco de anúncios de cada plataforma.

using System;
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;

/// <summary>
/// Demonstrates how to use the Google Mobile Ads app open ad format.
/// </summary>
[AddComponentMenu("GoogleMobileAds/Samples/AppOpenAdController")]
public class AppOpenAdController : MonoBehaviour
{

    // This ad unit is configured to always serve test ads.
    private string _adUnitId = "/6499/example/app-open";

    public bool IsAdAvailable
    {
        get
        {
            return _appOpenAd != null;
        }
    }

    public void Start()
    {
        // Initialize the Google Mobile Ads SDK.
        MobileAds.Initialize((InitializationStatus initStatus) =>
        {
            // This callback is called once the MobileAds SDK is initialized.
        });
    }

    /// <summary>
    /// Loads the app open ad.
    /// </summary>
    public void LoadAppOpenAd()
    {
    }

    /// <summary>
    /// Shows the app open ad.
    /// </summary>
    public void ShowAppOpenAd()
    {
    }
}

Carregar o anúncio de abertura do app

É possível carregar um anúncio de abertura do app usando o método estático Load() na classe AppOpenAd. O método de carregamento requer um ID do bloco de anúncios, um objeto AdManagerAdRequest e um gerenciador de conclusão, que é chamado quando o carregamento do anúncio é concluído ou falha. O objeto AppOpenAd carregado é fornecido como um parâmetro no gerenciador de conclusão. O exemplo abaixo mostra como carregar uma AppOpenAd.


  // This ad unit is configured to always serve test ads.
  private string _adUnitId = "/6499/example/app-open";

  private AppOpenAd appOpenAd;

  /// <summary>
  /// Loads the app open ad.
  /// </summary>
  public void LoadAppOpenAd()
  {
      // Clean up the old ad before loading a new one.
      if (appOpenAd != null)
      {
            appOpenAd.Destroy();
            appOpenAd = null;
      }

      Debug.Log("Loading the app open ad.");

      // Create our request used to load the ad.
      var adRequest = new AdManagerAdRequest();

      // send the request to load the ad.
      AppOpenAd.Load(_adUnitId, adRequest,
          (AppOpenAd ad, LoadAdError error) =>
          {
              // if error is not null, the load request failed.
              if (error != null || ad == null)
              {
                  Debug.LogError("app open ad failed to load an ad " +
                                 "with error : " + error);
                  return;
              }

              Debug.Log("App open ad loaded with response : "
                        + ad.GetResponseInfo());

              appOpenAd = ad;
              RegisterEventHandlers(ad);
          });
  }

Ouvir eventos de anúncios de abertura do app

Para personalizar ainda mais o comportamento do anúncio, você pode vincular a vários eventos do ciclo de vida do anúncio: abertura, fechamento etc. Detecte esses eventos registrando um delegado, conforme mostrado abaixo.

private void RegisterEventHandlers(AppOpenAd ad)
{
    // Raised when the ad is estimated to have earned money.
    ad.OnAdPaid += (AdValue adValue) =>
    {
        Debug.Log(String.Format("App open ad paid {0} {1}.",
            adValue.Value,
            adValue.CurrencyCode));
    };
    // Raised when an impression is recorded for an ad.
    ad.OnAdImpressionRecorded += () =>
    {
        Debug.Log("App open ad recorded an impression.");
    };
    // Raised when a click is recorded for an ad.
    ad.OnAdClicked += () =>
    {
        Debug.Log("App open ad was clicked.");
    };
    // Raised when an ad opened full screen content.
    ad.OnAdFullScreenContentOpened += () =>
    {
        Debug.Log("App open ad full screen content opened.");
    };
    // Raised when the ad closed full screen content.
    ad.OnAdFullScreenContentClosed += () =>
    {
        Debug.Log("App open ad full screen content closed.");
    };
    // Raised when the ad failed to open full screen content.
    ad.OnAdFullScreenContentFailed += (AdError error) =>
    {
        Debug.LogError("App open ad failed to open full screen content " +
                       "with error : " + error);
    };
}

Considere a validade dos anúncios

Para garantir que você não mostre um anúncio expirado, adicione um método ao AppOpenAdController que verifica há quanto tempo o anúncio foi carregado. Depois, use esse método para verificar se o anúncio continua válido.

O anúncio de abertura do app tem um tempo limite de 4 horas. Armazene o tempo de carregamento em cache na variável _expireTime.

// send the request to load the ad.
AppOpenAd.Load(_adUnitId, adRequest,
    (AppOpenAd ad, LoadAdError error) =>
    {
        // If the operation failed, an error is returned.
        if (error != null || ad == null)
        {
            Debug.LogError("App open ad failed to load an ad with error : " +
                            error);
            return;
        }

        // If the operation completed successfully, no error is returned.
        Debug.Log("App open ad loaded with response : " + ad.GetResponseInfo());

        // App open ads can be preloaded for up to 4 hours.
        _expireTime = DateTime.Now + TimeSpan.FromHours(4);

        _appOpenAd = ad;
    });

Atualize a propriedade IsAdAvailable, verifique o _expireTime e confirme se o anúncio carregado ainda é válido.

public bool IsAdAvailable
{
    get
    {
        return _appOpenAd != null
               && _appOpenAd.IsLoaded()
               && DateTime.Now < _expireTime;
    }
}

Detectar eventos de estado do app

Use o AppStateEventNotifier para detectar eventos em primeiro e segundo plano do aplicativo. Essa classe vai gerar o evento AppStateChanged sempre que o aplicativo estiver em primeiro ou segundo plano.

private void Awake()
{
    // Use the AppStateEventNotifier to listen to application open/close events.
    // This is used to launch the loaded ad when we open the app.
    AppStateEventNotifier.AppStateChanged += OnAppStateChanged;
}

private void OnDestroy()
{
    // Always unlisten to events when complete.
    AppStateEventNotifier.AppStateChanged -= OnAppStateChanged;
}

Quando processamos o estado AppState.Foreground e o IsAdAvailable é true, chamamos ShowAppOpenAd() para mostrar o anúncio.

private void OnAppStateChanged(AppState state)
{
    Debug.Log("App State changed to : "+ state);

    // if the app is Foregrounded and the ad is available, show it.
    if (state == AppState.Foreground)
    {
        if (IsAdAvailable)
        {
            ShowAppOpenAd();
        }
    }
}

Mostrar o anúncio de abertura do app

Para mostrar um anúncio de abertura do app carregado, chame o método Show() na instância AppOpenAd. Os anúncios só podem ser exibidos uma vez por carregamento. Use o método CanShowAd() para verificar se o anúncio está pronto para exibição.

/// <summary>
/// Shows the app open ad.
/// </summary>
public void ShowAppOpenAd()
{
    if (appOpenAd != null && appOpenAd.CanShowAd())
    {
        Debug.Log("Showing app open ad.");
        appOpenAd.Show();
    }
    else
    {
        Debug.LogError("App open ad is not ready yet.");
    }
}

Fazer uma limpeza no anúncio de abertura do app

Quando terminar de usar um AppOpenAd, chame o método Destroy() antes de descartar sua referência a ele:

appOpenAd.Destroy();

Isso notifica o plug-in de que o objeto não é mais usado e que a memória que ele ocupa pode ser recuperada. A falha em chamar esse método resulta em vazamentos de memória.

Pré-carregue o próximo anúncio de abertura do app

AppOpenAd é um objeto de uso único. Isso significa que, quando um anúncio de abertura do app é exibido, o objeto não pode ser usado novamente. Para solicitar outro anúncio, crie um novo objeto AppOpenAd.

Para preparar um anúncio de abertura do app para a próxima oportunidade de impressão, pré-carregue o anúncio depois que o evento de anúncio OnAdFullScreenContentClosed ou OnAdFullScreenContentFailed for gerado.

private void RegisterReloadHandler(AppOpenAd ad)
{
    ...
    // Raised when the ad closed full screen content.
    ad.OnAdFullScreenContentClosed += ()
    {
        Debug.Log("App open ad full screen content closed.");

        // Reload the ad so that we can show another as soon as possible.
        LoadAppOpenAd();
    };
    // Raised when the ad failed to open full screen content.
    ad.OnAdFullScreenContentFailed += (AdError error) =>
    {
        Debug.LogError("App open ad failed to open full screen content " +
                       "with error : " + error);

        // Reload the ad so that we can show another as soon as possible.
        LoadAppOpenAd();
    };
}

Inicializações a frio e telas de carregamento

Até agora, a documentação presume que você só exibe anúncios de abertura do app quando os usuários estão em primeiro plano seu app quando ele está suspenso na memória. A "inicialização a frio" ocorre quando o app é iniciado, mas não foi suspenso anteriormente na memória.

Um exemplo de inicialização a frio é quando um usuário abre o app pela primeira vez. Com inicializações a frio, você não terá um anúncio de abertura do app já carregado que está pronto para ser mostrado de imediato. O tempo entre a solicitação e o recebimento de um anúncio pode criar uma situação em que os usuários conseguem usar o app por um tempo antes de se surpreenderem com um anúncio fora de contexto. Isso precisa ser evitado porque é uma experiência ruim para o usuário.

A maneira recomendada de usar anúncios de abertura do app em inicializações a frio é usar uma tela de carregamento para carregar seus recursos do jogo ou app e exibir o anúncio somente nessa tela. Se o app tiver concluído o carregamento e enviado o usuário ao conteúdo principal dele, não mostre o anúncio.

Práticas recomendadas

Os anúncios de abertura do app ajudam a gerar receita com a tela de carregamento quando ele é iniciado pela primeira vez e durante a troca de apps, mas é importante seguir as práticas recomendadas a seguir para que os usuários aproveitem o aplicativo.

  • Mostre o primeiro anúncio de abertura do app depois que o usuário acessar o aplicativo algumas vezes.
  • Exiba anúncios de abertura do app nos períodos em que os usuários estariam esperando o carregamento do app.
  • Se você tiver uma tela de carregamento abaixo do anúncio de abertura do app e ela concluir o carregamento antes que o anúncio seja dispensado, dispense essa tela no manipulador de eventos OnAdDidDismissFullScreenContent.
  • Na plataforma iOS, AppStateEventNotifier instancia um AppStateEventClient GameObject. Esse GameObject é necessário para que os eventos sejam disparados, portanto, não o destrua. Os eventos deixam de ser disparados se o GameObject é destruído.

Outros recursos