برنامج تعليمي: تحسين النموذج المختلط لتحقيق الأرباح باستخدام AdMob و"إحصاءات Google" وFirebase

الخطوة 3: إعداد Firebase Remote Config لعرض تجارب إعلانية محدّدة


المقدمة: تحسين نموذج تحقيق الأرباح المختلط باستخدام AdMob وGoogle Analytics وFirebase
الخطوة 1: استخدِم AdMob لإنشاء وحدات إعلانية جديدة لعرض الإعلانات.
الخطوة 2: إعداد "إحصاءات Google"

الخطوة 3: إعداد Firebase Remote Config لعرض تجارب إعلانية محدّدة


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

إعداد مَعلمات Remote Config وشروطها في وحدة تحكّم Firebase

  1. في وحدة تحكُّم Firebase، افتح مشروعك على Firebase.

  2. في اللوحة على يمين الصفحة، وسِّع قسم التفاعل، ثم اختَر Remote Config (الإعداد عن بُعد).

  3. انقر على إنشاء إعداد (أو إضافة مَعلمة إذا سبق لك استخدام Remote Config).

  4. في لوحة إنشاء مَعلمة، أكمِل الخطوات التالية:

    1. في حقل اسم المَعلمة، أدخِل ad_control_switch.

    2. من القائمة المنسدلة Data type، اختَر Boolean.

    3. انقر على إنشاء جديد، ثم على إنشاء شرط جديد.

  5. في مربّع الحوار تحديد شرط جديد، أكمِل الخطوات التالية:

    1. في حقل الاسم، أدخِل Purchasers Group (أو أي اسم آخر يمكن تمييزه بسهولة للحالة).

    2. من القائمة المنسدلة ينطبق في حال...، اختَر شرائح جمهور المستخدِمين.

    3. من القائمة المنسدلة اختيار شرائح الجمهور، اختَر المشترون.

    4. انقر على حفظ الشرط.

  6. في لوحة إنشاء مَعلمة، أكمِل الخطوات التالية:

    1. بالنسبة إلى القيمة لمجموعة المشترين، اختَر false.

    2. بالنسبة إلى القيمة التلقائية، اختَر true.

  7. انقر على حفظ، ثم على نشر التغييرات.

سيتحقّق هذا الإعداد ممّا إذا كان المستخدِم ضِمن شريحة جمهور "المشترون" (أي أنّه مستخدِم يدفع رسومًا):

  • إذا كان المستخدِم ضِمن شريحة الجمهور "المشترون"، ستُعرِض Remote Config قيمة false للمَعلمة ad_control_switch.

  • إذا لم يكن المستخدِم في شريحة الجمهور "المشترون"، ستُعرِض الدالة Remote Config القيمة true للمَعلمة ad_control_switch.

في الخطوات التالية، ستنفّذ Remote Config في تطبيقك لمعالجة قيم هذه المَعلمات.

إضافة حزمة تطوير البرامج (SDK) لمنصّة Remote Config إلى تطبيقك

قبل استخدام Remote Config في رمز تطبيقك، أضِف حزمة تطوير البرامج (SDK) لتطبيق Remote Config إلى قاعدة بيانات تطبيقك. يُرجى العِلم أنّ تطبيقك يجب أن يحتوي على حزمة تطوير البرامج (SDK) لمنصّة Google Mobile Ads (AdMob) وحزمة تطوير البرامج (SDK) الخاصة بخدمة "إحصاءات Google لبرنامج Firebase" من الخطوات السابقة في هذا الدليل التعليمي.

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

pod 'Firebase/RemoteConfig'

أضِف الاعتماد على مكتبة Remote Config إلى ملف build.gradle:

implementation 'com.google.firebase:firebase-config:22.1.0'

من جذر مشروع Flutter، شغِّل الأمر التالي لتثبيت المكوّن الإضافي Remote Config:

flutter pub add firebase_remote_config

نزِّل أحدث إصدار من حزمة تطوير البرامج (SDK) لمنصّة Firebase في Unity وثبِّتها، ثم أضِف حزمة Remote Config إلى مشروعك:
FirebaseRemoteConfig.unitypackage

ضبط نسخة Remote Config

لكي يتمكّن تطبيقك من استخدام قيم مَعلمة Remote Config، عليك ضبط مثيل Remote Config لكي يتمكّن من استرجاع قيم جديدة لمثيل تطبيق العميل.

في هذا المثال، تم ضبط Remote Config للبحث عن قيم مَعلمات جديدة مرة واحدة كل ساعة.

remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 3600
remoteConfig.configSettings = settings
remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
remoteConfig = FirebaseRemoteConfig.instance;
  final configSettings = FirebaseRemoteConfigSettings(
    minimumFetchInterval: Duration(hours: 1),
  );
  await remoteConfig.setConfigSettings(configSettings);

  // Use the `onConfigUpdated` callback to listen for changes to the config settings.
  remoteConfig.onConfigUpdated.listen((_) {
    print('Config settings confirmed');
  });
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 بشكل مُسبق حتى يتمكّن تطبيقك من معرفة ما إذا كان سيعرض إعلانًا.

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()
}
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()
        }
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();
            }
        });
remoteConfig = FirebaseRemoteConfig.instance;

// Fetch and activate the latest Remote Config values.
final updated = await remoteConfig.fetchAndActivate();

// Check if the config params were updated successfully.
if (updated) {
  print('Config params updated');
} else {
  print('Config params failed to update');
}

// Load the ad unit.
_loadAdUnit();
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() لتحديد ما إذا كان يجب أن تُجري نسخة التطبيق الافتراضية أحد الإجراءات التالية:

  • يتمّ حلّ قيمة المَعلمة ad_control_switch على أنّها true: عرض الإعلان البيني (لأنّ المستخدم من مستخدمي الإصدارات المجانية).

  • يتمّ تحويل قيمة المَعلمة ad_control_switch إلى false: لا تعرِض الإعلان (لأنّ المستخدِم مستخدِم يدفع رسومًا).

private func loadAdUnit() {
  let showAds = remoteConfig["ad_control_switch"].boolValue

  if showAds {
    // Load interstitial ad (implemented ad unit)
    // per AdMob instructions (the first step of this tutorial).
  } else {
    // Don't show ads.
  }
}
private fun loadAdUnit() {
  var showAds = remoteConfig.getBoolean(ad_control_switch)

  if (showAds) {
      // Load interstitial ad (implemented ad unit)
      // per AdMob instructions (the first step of this tutorial).
    } else {
      // Don't show ads.
    }
}
private void loadAdUnit() {
    boolean showAds =
      mFirebaseRemoteConfig.getBoolean(ad_control_switch);

    if (showAds) {
      // Load interstitial ad (implemented ad unit)
      // per AdMob instructions (the first step of this tutorial).
    } else {
      // Don't show ads.
    }
}
void _loadAdUnit() {
  bool showAds = remoteConfig.getBool(ad_control_switch);

  if (showAds) {
    // Load interstitial ad (implemented ad unit)
    // per AdMob instructions (the first step of this tutorial).
  } else {
    // Don't show ads.
  }
}
void LoadAdUnit() {
  bool showAds =
      remoteConfig.GetValue("ad_control_switch").BooleanValue;

  if (showAds) {
    // Load interstitial ad (implemented ad unit)
    // per AdMob instructions (the first step of this tutorial).
  } else {
    // Don't show ads.
  }
}

إطلاق تطبيقك

بما أنّ منطق عرض الإعلان أو عدم عرضه مضمّن في قاعدة بياناتك، عليك إصدار نسخة جديدة من تطبيقك تحتوي على هذا المنطق.

إذا اتّبعت خطوات هذا الدليل التعليمي، من المفترض أن يبدأ تطبيقك على الفور في عرض تجربة إعلانات مخصّصة داخل التطبيق للمستخدمين. يمكنك تتبُّع أرباح إعلاناتك في كلّ من حسابك على AdMob ولوحات بيانات "إحصاءات Google" (إما في وحدة تحكّم Firebase أو واجهة مستخدِم "إحصاءات Google").


هذا كل ما في الأمر. لقد أكملت الدليل التعليمي لتحسين تحقيق الربح المختلط باستخدام AdMob و"إحصاءات Google" وFirebase.




الخطوة 2: إعداد "إحصاءات Google"