מדריך: אופטימיזציה של תדירות המודעות ב-AdMob

שלב 3: טיפול בערכי פרמטרים מסוג Remote Config בקוד האפליקציה


מבוא: אופטימיזציה של תדירות הצגת המודעות ב-AdMob באמצעות Firebase
שלב 1: אפשר להשתמש ב-AdMob כדי ליצור וריאנטים חדשים של יחידות מודעות לבדיקה
שלב 2: הגדרה בדיקת A/B במסוף Firebase

שלב 3: צריך לטפל ב-Remote Config ערכי פרמטרים בקוד של האפליקציה

שלב 4: שנתחיל? בדיקת ה-A/B ובדיקת תוצאות הבדיקה במסוף Firebase
שלב 5: החלטה האם להשיק את פורמט המודעה החדש


בסוף השלב האחרון, יצרתם את הפרמטר Remote Config (INTERSTITIAL_AD_KEY). בשלב הזה צריך להוסיף את הלוגיקה לקוד של האפליקציה של מה שהאפליקציה צריכה להציג על סמך הערך של אותו פרמטר.

הוספת ערכות ה-SDK הנדרשות

לפני שמשתמשים ב-Remote Config בקוד האפליקציה, צריך להוסיף את שני הרכיבים: Remote Config SDK ו-Firebase SDK for Google Analytics אל את קובצי ה-build של הפרויקט.

Swift

מוסיפים ומתקינים את ה-pods הבאים בקובץ ה-pod:

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

Objective-C

מוסיפים ומתקינים את ה-pods הבאים בקובץ ה-pod:

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

Android

מוסיפים את יחסי התלות הבאים של ספריות לקובץ build.gradle:

implementation 'com.google.android.gms:play-services-ads:23.3.0'
implementation 'com.google.firebase:firebase-analytics:22.1.0'
implementation 'com.google.firebase:firebase-config:22.0.0'

Unity

מורידים ומתקינים את Firebase Unity SDK, ואז מוסיפים את ה-Unity הבא חבילות לפרויקט שלך:

  • FirebaseAnalytics.unitypackage
  • FirebaseRemoteConfig.unitypackage

הגדרת מופע אחד (Remote Config)

כדי להשתמש בערכי הפרמטר Remote Config, צריך להגדיר את המכונה Remote Config כך שתאחזר ערכים חדשים למכונה של אפליקציית הלקוח.

בדוגמה הזו, Remote Config מוגדר לבדוק אם יש פרמטר חדש ערכים פעם בשעה.

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+KTX

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

אחזור והפעלה של Remote Config

מאחזרים את הפרמטרים Remote Config ומפעילים אותם כדי להתחיל להשתמש בהם את ערכי הפרמטרים החדשים.

מומלץ לבצע את השיחה הזו בהקדם האפשרי בשלב הטעינה של האפליקציה כי השיחה הזו אסינכרונית ונדרש הערך של Remote Config מאוחזרות מראש כדי שהאפליקציה תדע איזו מודעה להציג.

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+KTX

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

האפליקציה שלך מוכנה עכשיו לטפל בפרמטר Remote Config שיצרת במהלך בדיקת ה-A/B שהגדרתם קודם במדריך הזה.

שימוש בערך הפרמטר Remote Config

צריך להשתמש בערך Remote Config שאוחזר מראש בפונקציה loadAdUnit() כדי שיקבע איזה וריאנט של תדירות הצגת מודעות יוצג במופע הזה של האפליקציה.

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+KTX

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

הוספת בדיקות אחרות לערך הפרמטר

יש אזורים אחרים בקוד האפליקציה שבהם עליך לבדוק את של הפרמטר Remote Config הזה כדי לקבוע איזו חוויית צפייה במודעה תהיה נטען. לדוגמה, אתם יכולים להחליט אם לטעון מחדש מודעה אחרי שהמשתמש סיימתי להציג את הנוכחי.

קודם צריך לבצע את הקריאות לאחזור ולהפעלה כדי לקבל עדכונים לגבי ערכי הפרמטרים – לדוגמה, אם מחליטים לסיים ניסוי או ליצור ניסוי חדש.

לאחר מכן, תמיד תוכלו לבדוק את הערך של הפרמטר באמצעות הקריאות הבאות:

Swift

remoteConfig["INTERSTITIAL_AD_KEY"].stringValue

Objective-C

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

Java

mFirebaseRemoteConfig.getString(INTERSTITIAL_AD_KEY)

Kotlin+KTX

remoteConfig.getString(INTERSTITIAL_AD_KEY)

Unity

remoteConfig.GetValue("INTERSTITIAL_AD_KEY").StringValue

הקריאות האלה יחזירו תמיד את אותו הערך למופע של אפליקציה, בהתאם גם אם הוא הוגדר בקבוצת הבקרה או באחת מקבוצות הווריאנטים החדשות של המודעות, אלא אם בוצעו שינויים במסוף Firebase שאוחזרו, הופעל בשיחות הקודמות.




שלב 2: הגדרה של בדיקת A/B במסוף Firebase שלב 4: מתחילים בדיקת A/B לבדיקת תוצאות הבדיקה