Samouczek: optymalizacja częstotliwości wyświetlania reklam w AdMob

Krok 3. Obsługa wartości parametrów Remote Config w kodzie aplikacji


Wprowadzenie: Optymalizowanie AdMob częstotliwości wyświetlania reklam za pomocą Firebase
Krok 1. Tworzenie nowych wariantów jednostek reklamowych na potrzeby testowania w AdMob
Krok 2. Skonfiguruj test A/B w konsoli Firebase

Krok 3. Obsługa Remote Config wartości parametrów w kodzie aplikacji

Krok 4. Rozpoczynanie testu A/B i sprawdzanie jego wyników w konsoli Firebase
Krok 5: Podejmowanie decyzji o wdrożeniu nowego formatu reklamy


Na końcu ostatniego kroku utworzyliśmy parametrRemote Config(INTERSTITIAL_AD_KEY). W tym kroku dodamy do kodu aplikacji logikę, która określi, co ma się wyświetlać w aplikacji na podstawie wartości tego parametru.

Dodawanie wymaganych pakietów SDK

Zanim zaczniesz używać Remote Config w kodzie aplikacji, dodaj do plików kompilacji projektu pakiet SDK Remote Config i pakiet SDK Firebase dla Google Analytics.

Swift

Dodaj i zainstaluj te podsy w pliku podfile:

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

Objective-C

Dodaj i zainstaluj te podsy w pliku podfile:

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

Android

Dodaj te zależności biblioteki do pliku build.gradle:

implementation 'com.google.android.gms:play-services-ads:25.2.0'
implementation 'com.google.firebase:firebase-analytics:23.2.0'
implementation 'com.google.firebase:firebase-config:23.1.0'

Unity

Pobierz i zainstaluj pakiet Firebase Unity SDK, a następnie dodaj do projektu te pakiety Unity:

  • FirebaseAnalytics.unitypackage
  • FirebaseRemoteConfig.unitypackage

Konfigurowanie instancji Remote Config

Aby używać wartości parametrów Remote Config, skonfiguruj instancję Remote Config, która umożliwi pobieranie nowych wartości przez instancję aplikacji klienta.

W tym przykładzie Remote Config weryfikuje wartości parametrów co godzinę.

Swift

remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 3600
remoteConfig.configSettings = settings

Objective-C

self.remoteConfig = [FIRRemoteConfig remoteConfig];
FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init];
remoteConfigSettings.minimumFetchInterval = 3600;
self.remoteConfig.configSettings = remoteConfigSettings;

Java

mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);

Kotlin

remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)

Unity

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");
}

Pobieranie i aktywowanie Remote Config

Pobierz i aktywuj parametry Remote Config, aby mogła ona zacząć używać nowych wartości parametrów.

To wywołanie powinno pojawić się na etapie wczytywania aplikacji jak najszybciej ponieważ jest ono asynchroniczne, a wartość Remote Config musi być pobierana z wyprzedzeniem , żeby było wiadomo, jaka reklama ma się wyświetlić w aplikacji.

Swift

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()
}

Objective-C

[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];
}];

Java

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();
            }
        });

Kotlin

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()
        }

Unity

remoteConfig.FetchAndActivateAsync().ContinueWithOnMainThread(task => {
  if (task.IsFaulted) {
    Debug.LogWarning("Config params failed to update");
  } else {
    Debug.Log("Config params updated: " + task.Result);
  }
  LoadAdUnit();
});

Twoja aplikacja może teraz obsługiwać parametr Remote Config utworzony przez Ciebie podczas konfiguracji testu A/B, którą opisaliśmy wcześniej w tym samouczku.

Użyj wartości parametru Remote Config

Użyj pobranej z wyprzedzeniem wartości Remote Config w funkcji loadAdUnit(), aby określić, który wariant częstotliwości wyświetlania reklamy należy zastosować dla danej instancji aplikacji.

Swift

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.

Objective-C

- (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;
  }];
}

Java

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;
          }
    });
}

Kotlin

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
      }
    })
}

Unity

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);
}

Dodawanie innych sprawdzeń wartości parametru

W kodzie aplikacji są też inne miejsca, w których trzeba sprawdzić wartość tego Remote Config parametru, aby określić, jakie reklamy mają się wczytywać. Możesz na przykład zdecydować, czy reklama ma się przeładować po tym, jak użytkownik obejrzy bieżącą.

Wywołania związane z pobieraniem i aktywowaniem powinny być wykonane najpierw, aby umożliwić pobranie ewentualnych zmian wartości parametrów, np. gdy postanowisz zakończyć dotychczasowy eksperyment lub utworzyć nowy.

Wartość parametru możesz zawsze sprawdzić za pomocą tych wywołań:

Swift

remoteConfig["INTERSTITIAL_AD_KEY"].stringValue

Objective-C

self.remoteConfig[@"INTERSTITIAL_AD_KEY"].stringValue;

Java

mFirebaseRemoteConfig.getString(INTERSTITIAL_AD_KEY)

Kotlin

remoteConfig.getString(INTERSTITIAL_AD_KEY)

Unity

remoteConfig.GetValue("INTERSTITIAL_AD_KEY").StringValue

Te wywołania zawsze zwracają tę samą wartość dla instancji aplikacji w zależności od tego, czy znajduje się ona w grupie kontrolnej czy w jednej z grup testujących nowe warianty reklamy, chyba że w konsoli Firebase pojawiły się zmiany, które zostały pobrane i aktywowane w poprzednich wywołaniach.




Krok 2: Konfigurowanie testu A/B w konsoli Firebase Krok 4: Rozpoczynanie testu A/B i sprawdzanie jego wyników