Tutorial: como otimizar a frequência dos anúncios da AdMob

Etapa 3: lidar com os valores de parâmetros da Configuração remota no código do app



No final da última etapa, você criou um parâmetro da Configuração remota (INTERSTITIAL_AD_KEY). Nesta etapa, você vai adicionar a lógica ao código do seu app para o que ele deve exibir com base no valor desse parâmetro.

Adicionar os SDKs necessários

Antes de usar a Configuração remota no código do seu aplicativo, adicione o SDK da Configuração remota e o SDK do Firebase para o Google Analytics aos seus arquivos de versão do projeto.

Adicione e instale os seguintes pods no seu podfile:

pod 'Google-Mobile-Ads-SDK'
pod 'Firebase/Analytics'
pod 'Firebase/RemoteConfig'

Adicione e instale os seguintes pods no seu podfile:

pod 'Google-Mobile-Ads-SDK'
pod 'Firebase/Analytics'
pod 'Firebase/RemoteConfig'

Adicione as seguintes dependências de biblioteca ao seu arquivo build.gradle:

implementation 'com.google.android.gms:play-services-ads:20.6.0'
implementation 'com.google.firebase:firebase-analytics:21.0.0'
implementation 'com.google.firebase:firebase-config:21.1.0'

Adicione as seguintes dependências de biblioteca ao seu arquivo build.gradle:

implementation 'com.google.android.gms:play-services-ads:20.6.0'
implementation 'com.google.firebase:firebase-analytics-ktx:21.0.0'
implementation 'com.google.firebase:firebase-config-ktx:21.1.0'

Faça o download do SDK do Firebase para Unity e o instale. Depois adicione os seguintes pacotes do Unity ao seu projeto:

  • FirebaseAnalytics.unitypackage
  • FirebaseRemoteConfig.unitypackage

Configurar instância de Configuração remota

Para usar os valores de parâmetros da Configuração remota, configure a instância de Configuração remota para que ela seja usada para buscar novos valores para a instância do app cliente.

Neste exemplo, a Configuração remota está configurada para verificar novos valores de parâmetro uma vez por hora.

remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 3600
remoteConfig.configSettings = settings
self.remoteConfig = [FIRRemoteConfig remoteConfig];
FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init];
remoteConfigSettings.minimumFetchInterval = 3600;
self.remoteConfig.configSettings = remoteConfigSettings;
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)
var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
var configSettings = new ConfigSettings {
  MinimumFetchInternalInMilliseconds =
        (ulong)(new TimeSpan(1, 0, 0).TotalMilliseconds)
};
remoteConfig.SetConfigSettingsAsync(configSettings)
        .ContinueWithOnMainThread(task => {
          Debug.Log("Config settings confirmed");
}

Buscar e ativar a Configuração remota

Busque e ative os parâmetros da Configuração remota para que possa começar a usar os novos valores de parâmetros.

Faça essa chamada o quanto antes na fase de carregamento do app, porque ela é assíncrona e vai precisar do valor da Configuração remota pré-buscado para que o app saiba qual anúncio exibir.

remoteConfig.fetch() { (status, error) -> Void in
  if status == .success {
    print("Config fetched!")
    self.remoteConfig.activate() { (changed, error) in
      // ...
    }
  } else {
    print("Config not fetched")
    print("Error: \(error?.localizedDescription ?? "No error available.")")
  }
  self.loadAdUnit()
}
[self.remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
    if (status == FIRRemoteConfigFetchStatusSuccess) {
        NSLog(@"Config fetched!");
      [self.remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) {
        // ...
      }];
    } else {
        NSLog(@"Config not fetched");
        NSLog(@"Error %@", error.localizedDescription);
    }
    [self loadAdUnit];
}];
mFirebaseRemoteConfig.fetchAndActivate()
        .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
            @Override
            public void onComplete(@NonNull Task<Boolean> task) {
                if (task.isSuccessful()) {
                    boolean updated = task.getResult();
                    Log.d(TAG, "Config params updated: " + updated);
                } else {
                    Log.d(TAG, "Config params failed to update");
                }
                loadAdUnit();
            }
        });
remoteConfig.fetchAndActivate()
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                val updated = task.result
                Log.d(TAG, "Config params updated: $updated")
            } else {
                Log.d(TAG, "Config params failed to update")
            }
            loadAdUnit()
        }
remoteConfig.FetchAndActivateAsync().ContinueWithOnMainThread(task => {
  if (task.IsFaulted) {
    Debug.LogWarning("Config params failed to update");
  } else {
    Debug.Log("Config params updated: " + task.Result);
  }
  LoadAdUnit();
});

Seu app agora está pronto para processar o parâmetro da Configuração remota que criado durante o teste A/B que você já tinha configurado neste tutorial.

Usar o valor do parâmetro da Configuração remota

Use o valor pré-buscado do Configuração remota na função loadAdUnit() para determinar qual variante de frequência de anúncios precisa ser exibida para essa instância do app.

private func loadAdUnit() {
  let adUnitId = remoteConfig["INTERSTITIAL_AD_KEY"].stringValue;
  let request = GADRequest()
  GADInterstitialAd.load(withAdUnitID: adUnitId,
                               request: request,
                     completionHandler: { [self] ad, error in
                       if let error = error {
                         print("Failed to load: \(error.localizedDescription)")
                         return
                       }
                       interstitial = ad
                       // Register for callbacks.
                     }
  )
}

// Register for callbacks.
- (void)loadAdUnit {
    NSString *adUnitId =
      self.remoteConfig[@"INTERSTITIAL_AD_KEY"].stringValue;

  GADRequest *request = [GADRequest request];
  [GADInterstitialAd loadAdWithAdUnitId:adUnitId
                         request:request
                         completionHandler:^(GADInterstitialAd *ad,
                             NSError *error) {
    if (error) {
      NSLog(@"Failed to load interstitial ad with error: %@",
        [error localizedDescription]);
      return;
    }

    self.interstitial = ad;
  }];
}
private void loadAdUnit() {
    String adUnitId =
      mFirebaseRemoteConfig.getString("INTERSTITIAL_AD_KEY");

    // Load Interstitial Ad (assume adUnitId not null)
    AdRequest adRequest = new AdRequest.Builder().build();

    InterstitialAd.load(this, adUnitId, adRequest, new
        InterstitialAdLoadCallback() {
          @Override
          public void onAdLoaded(@NonNull InterstitialAd intertitialAd) {
            mInterstitialAd = interstitialAd;
          }

          @Override
          public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
            mInterstitialAd = null;
          }
    });
}
private fun loadAdUnit() {
  String adUnitId = remoteConfig.getString("INTERSTITIAL_AD_KEY")
  var adRequest = AdRequestBuilder.Builder().build()

  AdRequestBuilder.load(this, adUnitId, adRequest, object :
    InterstitialAdLoadCallback() {
      override fun onAdFailedToLoad(adError: LoadAdError) {
        mInterstitialAd = null
      }

      override fun onAdLoaded(interstitialAd: InterstitialAd) {
        mInterstitialAd = interstitialAd
      }
    })
}
void LoadAdUnit() {

  // Note that you may want to encode and parse two sets of ad unit IDs for
  // Android / iOS in the Unity implementation.
  String adUnitId = remoteConfig.GetValue("INTERSTITIAL_AD_KEY").StringValue;
  this.interstitial = new InterstitialAd(adUnitId);
}

Adicionar outras verificações para o valor do parâmetro

Há outras áreas no seu código do aplicativo onde vai ser necessário verificar o valor do parâmetro da Configuração remota para determinar qual experiência do anúncio vai ser carregada. Por exemplo, é possível decidir se quer recarregar um anúncio depois que o usuário tiver terminado de visualizar o atual.

As chamadas de busca e ativação precisam ser feitas primeiro para que as alterações de valor dos parâmetros sejam recebidas, por exemplo, se você decidir encerrar ou criar um novo experimento.

Depois disso, você sempre vai poder verificar o valor do parâmetro usando as seguintes chamadas:

remoteConfig["INTERSTITIAL_AD_KEY"].stringValue
self.remoteConfig[@"INTERSTITIAL_AD_KEY"].stringValue;
mFirebaseRemoteConfig.getString(INTERSTITIAL_AD_KEY)
remoteConfig.getString(INTERSTITIAL_AD_KEY)
remoteConfig.GetValue("INTERSTITIAL_AD_KEY").StringValue

Essas chamadas sempre vão retornar o mesmo valor para uma instância de app, dependendo se ela tiver sido colocada no grupo de controle ou em um dos novos grupos de variantes do anúncio, a menos que você tenha feito alterações no Console do Firebase que tenham sido buscadas e ativadas nas chamadas anteriores.




Etapa 2: configurar um teste A/B no Console do Firebase Etapa 4: iniciar o Teste A/B e revisar os resultados