إعداد "الإعلانات مقابل مكافأة"

اختيار النظام الأساسي: Android iOS Unity Flutter Android (إصدار قديم)

تتيح لك "الإعلانات مقابل مكافأة" مكافأة المستخدمين بمنتجات داخل التطبيق مقابل التفاعل مع إعلانات الفيديو و"إعلانات تشغيل إصدار بسيط من اللعبة" والاستطلاعات.

يشرح هذا الدليل كيفية دمج "الإعلانات مقابل مكافأة" في تطبيق Android.

قبل البدء

قبل المتابعة، يُرجى اتّخاذ الإجراءات التالية:

  • إعداد GMA Next-Gen SDK
  • استخدام رقم تعريف الوحدة الإعلانية الاختبارية لـ "الإعلانات مقابل مكافأة" ca-app-pub-3940256099942544/5224354917
    • عند إنشاء تطبيقك واختباره، احرص على استخدام الإعلانات الاختبارية بدلاً من الإعلانات المباشرة المعروضة في بيئة الإنتاج. إذا لم تستخدم رقم تعريف الوحدة الإعلانية الاختبارية، يمكن أن تعلّق Google حسابك.
    • قبل نشر تطبيقك، استبدِل هذا الرقم برقم تعريف وحدتك الإعلانية.
    • للاطّلاع على تفاصيل الإعلانات الاختبارية GMA Next-Gen SDK، يُرجى قراءة مقالة تفعيل الإعلانات الاختبارية.

فهم ميزة التحميل المسبق للإعلانات (إصدار تجريبي)

تعمل ميزة التحميل المسبق للإعلانات في GMA Next-Gen SDK على أتمتة عملية تحميل الإعلانات وتخزينها مؤقتًا.

توفّر ميزة التحميل المسبق للإعلانات المزايا التالية:

  • إدارة المراجع: يتم الاحتفاظ بالمراجع إلى أن تظهر الإعلانات.
  • إعادة التحميل التلقائي: يتم تحميل إعلان جديد عند استرداد إعلان من ذاكرة التخزين المؤقت.
  • إعادة المحاولة المُدارة: يتم تحميل إعلان جديد عندما يتعذّر تحميل إعلان.
  • التعامل مع انتهاء الصلاحية: يتم إعادة تحميل الإعلانات قبل انتهاء صلاحيتها.
  • تحسين ذاكرة التخزين المؤقت: يتم تحسين ترتيب ذاكرة التخزين المؤقت لعرض الإعلان ذي الأولوية القصوى.

بدء ميزة التحميل المسبق للإعلانات

لبدء التحميل المسبق للإعلانات، استدعِ الطريقة start مرة واحدة عند تهيئة GMA Next-Gen SDK. بعد استدعاء الطريقة start، تعمل GMA Next-Gen SDK تلقائيًا على التحميل المسبق للإعلانات وإعادة محاولة الطلبات التي تعذّر إرسالها للإعدادات التي تم تحميلها مسبقًا.

يوضّح المثال التالي كيفية بدء التحميل المسبق للإعلانات:

Kotlin

val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedAdPreloader.start(adUnitId, preloadConfig)

جافا

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedAdPreloader.start(adUnitId, preloadConfig);

استبدِل AD_UNIT_ID برقم تعريف وحدتك الإعلانية.

يوضّح المثال السابق كيفية استخدام رقم تعريف الوحدة الإعلانية كرقم تعريف للتحميل المسبق. رقم تعريف التحميل المسبق هو معرّف سلسلة تنشئه لتحديد إعدادات التحميل المسبق للإعلانات. إذا كان تطبيقك يتطلّب إعدادات استهداف متعدّدة لرقم تعريف الوحدة الإعلانية نفسه، مرِّر معرّف سلسلة مخصّصًا.

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

الحصول على الإعلان الذي تم تحميله مسبقًا وعرضه

قبل عرض الإعلان، استدعِ الطريقة pollAd. لا تخزِّن عنصر الإعلان الذي تم تحميله مسبقًا. عند استدعاء الطريقة pollAd، تستردّ GMA Next-Gen SDK إعلانًا متاحًا وتحمِّل تلقائيًا الإعلان التالي مسبقًا في الخلفية. إذا لم يتوفّر أي إعلان ، لن تعرض GMA Next-Gen SDK أي إعلانات.

عندما يتوفّر لديك عنصر إعلان، استدعِ الطريقة show لعرض الإعلان. استخدِم مستمعًا للمكافآت للتعامل مع أحداث المكافآت. يوضّح المثال التالي كيفية استرداد إعلان تم تحميله مسبقًا وعرضه:

Kotlin

private fun pollAndShowAd(activity: Activity, adUnitId: String) {
  // Polling returns the next available ad and loads another ad in the background.
  val ad = RewardedAdPreloader.pollAd(adUnitId)
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not available.")
    return
  }

  // Interact with the ad object as needed.
  Log.d(TAG, "Rewarded ad response info: ${ad.getResponseInfo()}")
  ad.adEventCallback =
    object : RewardedAdEventCallback {
      override fun onAdImpression() {
        Log.d(TAG, "Rewarded ad recorded an impression.")
      }
    }
  ad.show(activity) { rewardItem -> Log.d(TAG, "User earned reward: ${rewardItem.amount}") }
}

جافا

private void pollAndShowAd(Activity activity, String adUnitId) {
  // Polling returns the next available ad and loads another ad in the background.
  final RewardedAd ad = RewardedAdPreloader.pollAd(adUnitId);

  // Interact with the ad object as needed.
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not available.");
    return;
  }

  Log.d(TAG, "Rewarded ad response info: " + ad.getResponseInfo());
  ad.setAdEventCallback(
      new RewardedAdEventCallback() {
        @Override
        public void onAdImpression() {
          Log.d(TAG, "Rewarded ad recorded an impression.");
        }
      });

  // Show the ad.
  ad.show(
      activity,
      rewardItem -> {
        Log.d(TAG, "User earned reward: " + rewardItem.getAmount());
      });
}

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

الاستماع إلى أحداث الإعلانات

قبل عرض الإعلان، استمع إلى أحداث الإعلانات. يسجِّل المثال التالي عمليات معاودة الاتصال لأحداث الإعلانات:

Kotlin

private fun listenToAdEvents() {
  // Listen for ad events.
  val ad = rewardedAd
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not ready yet.")
    return
  }

  ad.adEventCallback =
    object : RewardedAdEventCallback {
      override fun onAdShowedFullScreenContent() {
        // Rewarded ad did show.
      }

      override fun onAdDismissedFullScreenContent() {
        // Rewarded ad did dismiss.
        rewardedAd = null
      }

      override fun onAdFailedToShowFullScreenContent(
        fullScreenContentError: FullScreenContentError
      ) {
        // Rewarded ad failed to show.
        Log.e(TAG, "Rewarded ad failed to show: ${fullScreenContentError.message}")
      }

      override fun onAdImpression() {
        // Rewarded ad did record an impression.
      }

      override fun onAdClicked() {
        // Rewarded ad did record a click.
      }
    }
}

جافا

private void listenToAdEvents() {
  // Listen for ad events.
  if (rewardedAd == null) {
    Log.e(TAG, "Rewarded ad is not ready yet.");
    return;
  }

  rewardedAd.setAdEventCallback(
      new RewardedAdEventCallback() {
        @Override
        public void onAdShowedFullScreenContent() {
          // Rewarded ad did show.
        }

        @Override
        public void onAdDismissedFullScreenContent() {
          // Rewarded ad did dismiss.
          rewardedAd = null;
        }

        @Override
        public void onAdFailedToShowFullScreenContent(
            FullScreenContentError fullScreenContentError) {
          // Rewarded ad failed to show.
          Log.e(TAG, "Rewarded ad failed to show: " + fullScreenContentError.getMessage());
        }

        @Override
        public void onAdImpression() {
          // Rewarded ad did record an impression.
        }

        @Override
        public void onAdClicked() {
          // Rewarded ad did record a click.
        }
      });
}

اختياري: التحقّق من عمليات معاودة الاتصال الخاصة بميزة "التحقّق من جهة الخادم" (SSV)

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

  • مَعلَمة طلب البحث user_id: تحدِّد المستخدم الذي سيتم إضافة الرصيد إليه، مثل رقم تعريف حساب داخلي.
  • مَعلَمة طلب البحث custom_data: تحمل بيانات التطبيق، مثل موضع المكافأة أو مستوى اللعبة أو رقم عشوائي من إنشاء الخادم.

إذا لم تضبط قيمة، ستزيل Google مَعلَمة طلب البحث هذه من عملية معاودة الاتصال الخاصة بميزة "التحقّق من جهة الخادم" (SSV).

يضبط المثال التالي بيانات مخصّصة على عنصر إعلان قبل عرضه:

Kotlin

RewardedAd.load(
  context,
  AD_UNIT_ID,
  AdRequest.Builder().build(),
  object : RewardedAdLoadCallback() {
    override fun onAdLoaded(ad: RewardedAd) {
      rewardedAd = ad
      val options =
        ServerSideVerificationOptions.Builder().setCustomData("SAMPLE_CUSTOM_DATA_STRING").build()
      rewardedAd?.setServerSideVerificationOptions(options)
    }
  },
)

جافا

RewardedAd.load(
    context,
    AD_UNIT_ID,
    new AdRequest.Builder().build(),
    new RewardedAdLoadCallback() {
      @Override
      public void onAdLoaded(RewardedAd ad) {
        rewardedAd = ad;
        ServerSideVerificationOptions options =
            new ServerSideVerificationOptions.Builder()
                .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
                .build();
        rewardedAd.setServerSideVerificationOptions(options);
      }
    });

استبدِل SAMPLE_CUSTOM_DATA_STRING ببياناتك المخصّصة.

نقطة أساسية: يتم ترميز مَعلَمة طلب البحث custom_data بنسبة مئوية . قبل تحليل القيمة، عليك فك ترميز السلسلة بعنوان URL على خادمك والتحقّق من توقيع عملية معاودة الاتصال قبل الوثوق بمَعلَمتَي طلب البحث user_id أو custom_data.

اختياري: الاستماع إلى أحداث التحميل المسبق

عند بدء التحميل المسبق للإعلانات، سجِّل أحداث التحميل المسبق لتلقّي إشعار عند التحميل المسبق للإعلانات بنجاح أو تعذُّر التحميل المسبق أو استنفاد ذاكرة التخزين المؤقت للإعلانات.

يوضّح المثال التالي كيفية تسجيل أحداث التحميل المسبق للإعلانات:

Kotlin

val preloadCallback =
  object : PreloadCallback {
    override fun onAdFailedToPreload(preloadId: String, adError: LoadAdError) {
      Log.d(TAG, "Rewarded preload ad $preloadId failed to load with error: ${adError.message}")
    }

    override fun onAdsExhausted(preloadId: String) {
      Log.i(TAG, "Rewarded preload ad $preloadId is not available")
    }

    override fun onAdPreloaded(preloadId: String, responseInfo: ResponseInfo) {
      Log.i(TAG, "Rewarded preload ad $preloadId is available")
    }
  }
val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedAdPreloader.start(adUnitId, preloadConfig, preloadCallback)

جافا

PreloadCallback preloadCallback =
    new PreloadCallback() {
      @Override
      public void onAdFailedToPreload(String preloadId, LoadAdError adError) {
        Log.d(
            TAG,
            String.format(
                "Rewarded preload ad %s failed to load with error: %s",
                preloadId, adError.getMessage()));
      }

      @Override
      public void onAdsExhausted(String preloadId) {
        Log.i(TAG, "Rewarded preload ad " + preloadId + " is not available");
      }

      @Override
      public void onAdPreloaded(String preloadId, ResponseInfo responseInfo) {
        Log.i(TAG, "Rewarded preload ad " + preloadId + " is available");
      }
    };

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedAdPreloader.start(adUnitId, preloadConfig, preloadCallback);

عندما يتعذّر تحميل إعلان، تعمل GMA Next-Gen SDK تلقائيًا على التحميل المسبق للإعلانات وإعادة محاولة الطلبات التي تعذّر إرسالها للإعدادات التي تم تحميلها مسبقًا. لا تستدعِ طلبات التحميل اليدوي في عمليات معاودة الاتصال الخاصة بحالات الفشل. في طرق رد الاتصال الخاصة بأحداث خلال التحميل المُسبق، لا تستدعِ الطرق pollAd أو destroy أو start. يمكن أن يؤدي استدعاء هذه الطرق في عمليات معاودة الاتصال إلى استدعاء حلقات تحميل متكرّرة.

اختياري: التحقّق من توفّر الإعلانات

إذا كنت بحاجة إلى معرفة ما إذا كان الإعلان متاحًا، تحقَّق من توفّر الإعلانات. يتحقّق المثال التالي مما إذا كان الإعلان الذي تم تحميله مسبقًا متاحًا:

Kotlin

private fun isAdAvailable(adUnitId: String): Boolean {
  return RewardedAdPreloader.isAdAvailable(adUnitId)
}

جافا

private boolean isAdAvailable(String adUnitId) {
  return RewardedAdPreloader.isAdAvailable(adUnitId);
}

اختياري: ضبط حجم المخزن المؤقت

يتحكّم حجم ذاكرة التخزين المؤقت في عدد الإعلانات التي تم تحميلها مسبقًا والمخزّنة في الذاكرة. تُحسِّن Google تلقائيًا حجم المخزن المؤقت لتحقيق التوازن بين استهلاك الذاكرة ووقت الاستجابة لعرض الإعلانات. يمكنك ضبط حجم ذاكرة التخزين المؤقت المخصّص لزيادة عدد الإعلانات المحفوظة في الذاكرة أو تقليله. ننصحك بضبط حجم ذاكرة التخزين المؤقت على إعلانَين تم تحميلهما مسبقًا. إذا كانت معظم الزيارات واردة من أجهزة ذات ذاكرة منخفضة، قلِّل حجم ذاكرة التخزين المؤقت.

يوضّح المثال التالي كيفية ضبط حجم المخزن المؤقت:

Kotlin

val adRequest = AdRequest.Builder(adUnitId).build()
// Define a PreloadConfiguration and set the buffer size to 2 preloaded ads.
val preloadConfig = PreloadConfiguration(adRequest, bufferSize = 2)
RewardedAdPreloader.start(adUnitId, preloadConfig)

جافا

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
// Define a PreloadConfiguration and set the buffer size to 2 preloaded ads.
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest, 2);
RewardedAdPreloader.start(adUnitId, preloadConfig);

حدود ذاكرة التخزين المؤقت للتحميل المسبق

GMA Next-Gen SDK تفرض حدًا على مستوى التطبيق لعدد الإعلانات الإجمالي التي تم تحميلها مسبقًا على مستوى جميع الوحدات الإعلانية وأرقام تعريف التحميل المسبق:

  • الحدّ التلقائي: تحتفظ Google بحدّ أقصى يبلغ ستة إعلانات تم تحميلها مسبقًا في الذاكرة. يتم مشاركة هذا الحدّ على مستوى جميع الأشكال وأرقام تعريف التحميل المسبق.
  • ننصحك بالاحتفاظ بحجم ذاكرة التخزين المؤقت يبلغ اثنين لكل رقم تعريف تحميل مسبق.

اختياري: إيقاف التحميل المسبق للإعلانات

أبقِ ميزة التحميل المسبق مفعّلة أثناء عرض تطبيقك للإعلانات. خلال هذه الفترة، لا تستدعِ الطريقة destroy. إذا لم تكن بحاجة إلى عرض الإعلانات لرقم تعريف تحميل مسبق معيّن مرة أخرى في الجلسة، يمكنك إيقاف التحميل المسبق للإعلانات. لإيقاف تحميل الإعلانات لرقم تعريف تحميل مسبق معيّن، استدعِ الطريقة destroy باستخدام رقم تعريف التحميل المسبق. تؤدي استدعاء الطريقة destroy إلى إزالة جميع الإعلانات التي تم تحميلها مسبقًا والمرتبطة برقم تعريف التحميل المسبق من ذاكرة التخزين المؤقت.

يوضّح المثال التالي كيفية إيقاف التحميل المسبق للإعلانات:

Kotlin

private fun stopPreloading(adUnitId: String) {
  // Stops the preloading and destroy preloaded ads.
  RewardedAdPreloader.destroy(adUnitId)
}

جافا

private void stopPreloading(String adUnitId) {
  // Stops the preloading and destroy preloaded ads.
  RewardedAdPreloader.destroy(adUnitId);
}

اختياري: قراءة معلومات الاستجابة

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

يوضّح المثال التالي كيفية قراءة معلومات الاستجابة للإعلان التالي الذي تم تحميله مسبقًا:

Kotlin

val responseInfo = RewardedAdPreloader.peekAdResponseInfo(preloadId)
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.")
  return
}

Log.d(TAG, "Peeked ad response ID: ${responseInfo.responseId}")

جافا

ResponseInfo responseInfo = RewardedAdPreloader.peekAdResponseInfo(preloadId);
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.");
  return;
}

Log.d(TAG, "Peeked ad response ID: " + responseInfo.getResponseId());