برنامج تعليمي: تحسين معدّل تكرار إعلانات AdMob

الخطوة 3: التعامل مع قيم المَعلمة Remote Config في الرمز البرمجي لتطبيقك


مقدمة: تحسين AdMob معدّل تكرار الإعلانات باستخدام Firebase
الخطوة 1: استخدِم AdMob لإنشاء أشكال جديدة من الوحدات الإعلانية بغرض الاختبار
الخطوة 2: إعداد اختبار A/B في Firebase console

الخطوة 3: التعامل مع قيم المَعلمة Remote Config في رمز تطبيقك

الخطوة 4: بدء اختبار A/B ومراجعة نتائج الاختبار في وحدة تحكّم Firebase
الخطوة 5: تحديد ما إذا كنت تريد طرح شكل الإعلان الجديد


في نهاية الخطوة الأخيرة، أنشأت المَعلمة Remote Config(INTERSTITIAL_AD_KEY). في هذه الخطوة، ستضيف منطقًا إلى رمز تطبيقك لتحديد ما يجب أن يعرضه تطبيقك استنادًا إلى قيمة هذه المَعلمة.

إضافة حِزم تطوير البرامج (SDK) المطلوبة

قبل استخدام Remote Config في رمز تطبيقك، أضِف كلاً من حزمة تطوير البرامج (SDK) الخاصة بـ Remote Config وحزمة تطوير البرامج (SDK) الخاصة بـ Firebase من أجل Google Analytics إلى ملفات إنشاء مشروعك.

Swift

أضِف وثبِّت مجموعات الإعلانات المتسلسلة التالية في ملف podfile:

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

Objective-C

أضِف وثبِّت مجموعات الإعلانات المتسلسلة التالية في ملف podfile:

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

Android

أضِف تبعيات المكتبة التالية إلى ملف 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

نزِّل حزمة 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

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 تم استرجاعها وتفعيلها في الطلبات السابقة.




الخطوة 2: إعداد اختبار A/B في وحدة تحكّم Firebase الخطوة 4: بدء اختبار A/B ومراجعة نتائجه