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

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


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

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

الخطوة 4: البدء اختبار أ/ب ومراجعة نتائج الاختبار في وحدة تحكّم 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:23.3.0'
implementation 'com.google.firebase:firebase-analytics:22.1.0'
implementation 'com.google.firebase:firebase-config:22.0.0'

Unity

عليك تنزيل حزمة تطوير البرامج (SDK) لمنصّة 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+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 التي أنشأتها. أثناء اختبار أ/ب الذي تم إعداده سابقًا في هذا البرنامج التعليمي.

استخدام قيمة المَعلمة 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: إعداد اختبار أ/ب في وحدة تحكّم Firebase الخطوة 4: بدء اختبار أ/ب مراجعة نتائج الاختبار