آموزش گام‌به‌گام: بهینه‌سازی تناوب آگهی AdMob

مرحله ۳: مدیریت مقادیر پارامتر Remote Config در کد برنامه


مقدمه: بهینه‌سازی AdMob تناوب آگهی بااستفاده از Firebase
مرحله ۱: از AdMob برای ایجاد انواع واحد آگهی جدید برای آزمایش استفاده کنید
مرحله ۲: راه‌اندازی آزمون آ/ب در کنسول Firebase

مرحله ۳: مدیریت مقادیر پارامتر Remote Config در کد برنامه

مرحله ۴: شروع آزمون آ/ب و مرور نتایج آزمون در کنسول Firebase
مرحله ۵: تصمیم بگیرید قالب آگهی جدید را عرضه کنید یا نه


در پایان مرحله آخر، پارامتر Remote Config را ایجاد کردید (INTERSTITIAL_AD_KEY). در این مرحله، منطق را به کد برنامه‌تان اضافه می‌کنید تا براساس مقدار آن پارامتر، برنامه شما چه چیزی را نمایش دهد.

کیت‌های توسعه نرم‌افزار موردنیاز را اضافه کنید

قبل‌از استفاده از Remote Config در کد برنامه، هم کیت توسعه نرم‌افزار Remote Config و هم کیت توسعه نرم‌افزار Firebase برای Google Analytics را به فایل‌های ساخت پروژه اضافه کنید.

Swift

غلاف‌های زیر را به فایل غلاف خود اضافه و نصب کنید:

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

Objective-C

غلاف‌های زیر را به فایل غلاف خود اضافه و نصب کنید:

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

Android

وابستگی‌های کتابخانه زیر را به فایل build.gradle خود اضافه کنید:

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

Unity

«کیت توسعه نرم‌افزار Firebase Unity» را بارگیری و نصب کنید، سپس بسته‌های 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

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

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

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

remoteConfig.getString(INTERSTITIAL_AD_KEY)

Unity

remoteConfig.GetValue("INTERSTITIAL_AD_KEY").StringValue

این تماس‌ها همیشه مقدار یکسانی را برای نمونه برنامه برمی‌گردانند، بسته به اینکه در گروه کنترل یا یکی از گروه‌های متغیر آگهی جدید قرار گرفته باشد، مگر اینکه در کنسول Firebase تغییراتی ایجاد شده باشد که در تماس‌های قبلی واکشی و فعال شده باشد.




مرحله ۲: راه‌اندازی کردن آزمون آ/ب در کنسول Firebase مرحله ۴: شروع کردن آزمون آ/ب و بررسی نتایج آزمون