الإعلانات على شاشة فتح التطبيق

اختيار النظام الأساسي: Android iOS Unity Flutter

هذا الدليل مخصّص للناشرين الذين يدمجون "الإعلانات أثناء تشغيل التطبيق" باستخدام حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة .

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

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

المتطلبات الأساسية

اختبار الإعلانات دائمًا باستخدام الإعلانات الاختبارية

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

أسهل طريقة لتحميل الإعلانات الاختبارية هي استخدام المعرّف المخصّص لوحدة الإعلانات الاختبارية من أجل "الإعلانات عند فتح التطبيق":

ca-app-pub-3940256099942544/9257395921

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

لمزيد من المعلومات حول طريقة عمل الإعلانات الاختبارية في حزمة Google Mobile Ads SDK، راجِع مقالة تفعيل الإعلانات الاختبارية.

تمديد فئة التطبيق

أنشئ فئة جديدة توسّع الفئة Application. ويوفّر ذلك طريقة تراعي مراحل النشاط لإدارة الإعلانات المرتبطة بحالة التطبيق بدلاً من Activity واحدة:

Java

public class MyApplication extends Application
    implements ActivityLifecycleCallbacks, DefaultLifecycleObserver {

  private AppOpenAdManager appOpenAdManager;
  private Activity currentActivity;

  @Override
  public void onCreate() {
    super.onCreate();
    this.registerActivityLifecycleCallbacks(this);

    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    appOpenAdManager = new AppOpenAdManager();
  }

Kotlin

class MyApplication :
  MultiDexApplication(), Application.ActivityLifecycleCallbacks, DefaultLifecycleObserver {

  private lateinit var appOpenAdManager: AppOpenAdManager
  private var currentActivity: Activity? = null

  override fun onCreate() {
    super<MultiDexApplication>.onCreate()
    registerActivityLifecycleCallbacks(this)

    ProcessLifecycleOwner.get().lifecycle.addObserver(this)
    appOpenAdManager = AppOpenAdManager()
  }

بعد ذلك، أضِف الرمز التالي إلى AndroidManifest.xml:

<!-- TODO: Update to reference your actual package name. -->
<application
    android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>

تنفيذ مكوّن الأداة المساعدة

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

نفِّذ مكوّنًا مساعدًا AppOpenAdManager لتغليف العمل المرتبط بتحميل "الإعلانات على شاشة فتح التطبيق" وعرضها:

Java

private class AppOpenAdManager {

  private static final String LOG_TAG = "AppOpenAdManager";
  private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/9257395921";

  private AppOpenAd appOpenAd = null;
  private boolean isLoadingAd = false;
  private boolean isShowingAd = false;

  /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */
  private long loadTime = 0;

  /** Constructor. */
  public AppOpenAdManager() {}

Kotlin

private inner class AppOpenAdManager {

  private var appOpenAd: AppOpenAd? = null
  private var isLoadingAd = false
  var isShowingAd = false

  /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */
  private var loadTime: Long = 0

لاستخدام AppOpenAdManager، استدعِ طرق برنامج تضمين عامة على مثيل MyApplication الفردي. تتفاعل الفئة Application مع بقية الرمز، وتفوّض مهمة تحميل الإعلان وعرضه إلى المدير.

تحميل إعلان

تتمثّل الخطوة التالية في ملء loadAd() والتعامل مع عمليات معاودة الاتصال الخاصة بتحميل الإعلانات.

Java

AppOpenAd.load(
    context,
    "AD_UNIT_ID",
    new AdRequest.Builder().build(),
    new AppOpenAdLoadCallback() {
      @Override
      public void onAdLoaded(AppOpenAd ad) {
        // Called when an app open ad has loaded.
        Log.d(LOG_TAG, "App open ad loaded.");

        appOpenAd = ad;
        isLoadingAd = false;
        loadTime = (new Date()).getTime();
      }

      @Override
      public void onAdFailedToLoad(LoadAdError loadAdError) {
        // Called when an app open ad has failed to load.
        Log.d(LOG_TAG, "App open ad failed to load with error: " + loadAdError.getMessage());

        isLoadingAd = false;
      }
    });

Kotlin

AppOpenAd.load(
  context,
  "AD_UNIT_ID",
  AdRequest.Builder().build(),
  object : AppOpenAdLoadCallback() {
    override fun onAdLoaded(ad: AppOpenAd) {
      // Called when an app open ad has loaded.
      Log.d(LOG_TAG, "App open ad loaded.")

      appOpenAd = ad
      isLoadingAd = false
      loadTime = Date().time
    }

    override fun onAdFailedToLoad(loadAdError: LoadAdError) {
      // Called when an app open ad has failed to load.
      Log.d(LOG_TAG, "App open ad failed to load with error: " + loadAdError.message)

      isLoadingAd = false
    }
  },
)

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

عرض الإعلان

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

تعرض التعليمة البرمجية التالية إعلانًا ثم تعيد تحميله:

Java

public void showAdIfAvailable(
    @NonNull final Activity activity,
    @NonNull OnShowAdCompleteListener onShowAdCompleteListener) {
  // If the app open ad is already showing, do not show the ad again.
  if (isShowingAd) {
    Log.d(TAG, "The app open ad is already showing.");
    return;
  }

  // If the app open ad is not available yet, invoke the callback then load the ad.
  if (appOpenAd == null) {
    Log.d(TAG, "The app open ad is not ready yet.");
    onShowAdCompleteListener.onShowAdComplete();
    // Load an ad.
    return;
  }

  isShowingAd = true;
  appOpenAd.show(activity);
}

Kotlin

fun showAdIfAvailable(activity: Activity, onShowAdCompleteListener: OnShowAdCompleteListener) {
  // If the app open ad is already showing, do not show the ad again.
  if (isShowingAd) {
    Log.d(TAG, "The app open ad is already showing.")
    return
  }

  // If the app open ad is not available yet, invoke the callback then load the ad.
  if (appOpenAd == null) {
    Log.d(TAG, "The app open ad is not ready yet.")
    onShowAdCompleteListener.onShowAdComplete()
    // Load an ad.
    return
  }

  isShowingAd = true
  appOpenAd?.show(activity)
}

ضبط FullScreenContentCallback

يتعامل FullScreenContentCallback مع الأحداث المرتبطة بعرض AppOpenAd. قبل عرض AppOpenAd، تأكَّد من ضبط دالة الرجوع على النحو التالي:

Java

appOpenAd.setFullScreenContentCallback(
    new FullScreenContentCallback() {
      @Override
      public void onAdDismissedFullScreenContent() {
        // Called when full screen content is dismissed.
        Log.d(TAG, "Ad dismissed fullscreen content.");
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        appOpenAd = null;
        isShowingAd = false;

        onShowAdCompleteListener.onShowAdComplete();
        // Load an ad.
      }

      @Override
      public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
        // Called when full screen content failed to show.
        Log.d(TAG, adError.getMessage());
        appOpenAd = null;
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        isShowingAd = false;

        onShowAdCompleteListener.onShowAdComplete();
        // Load an ad.
      }

      @Override
      public void onAdShowedFullScreenContent() {
        Log.d(TAG, "Ad showed fullscreen content.");
      }

      @Override
      public void onAdImpression() {
        // Called when an impression is recorded for an ad.
        Log.d(TAG, "The ad recorded an impression.");
      }

      @Override
      public void onAdClicked() {
        // Called when ad is clicked.
        Log.d(TAG, "The ad was clicked.");
      }
    });

Kotlin

appOpenAd?.fullScreenContentCallback =
  object : FullScreenContentCallback() {
    override fun onAdDismissedFullScreenContent() {
      // Called when full screen content is dismissed.
      Log.d(TAG, "Ad dismissed fullscreen content.")
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      appOpenAd = null
      isShowingAd = false

      onShowAdCompleteListener.onShowAdComplete()
      // Load an ad.
    }

    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
      // Called when full screen content failed to show.
      Log.d(TAG, adError.message)
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      appOpenAd = null
      isShowingAd = false

      onShowAdCompleteListener.onShowAdComplete()
      // Load an ad.
    }

    override fun onAdShowedFullScreenContent() {
      Log.d(TAG, "Ad showed fullscreen content.")
    }

    override fun onAdImpression() {
      // Called when an impression is recorded for an ad.
      Log.d(TAG, "The ad recorded an impression.")
    }

    override fun onAdClicked() {
      // Called when ad is clicked.
      Log.d(TAG, "The ad was clicked.")
    }
  }

مراعاة مدة صلاحية الإعلان

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

Java

/** Check if ad was loaded more than n hours ago. */
private boolean wasLoadTimeLessThanNHoursAgo(long numHours) {
  long dateDifference = (new Date()).getTime() - loadTime;
  long numMilliSecondsPerHour = 3600000;
  return (dateDifference < (numMilliSecondsPerHour * numHours));
}

/** Check if ad exists and can be shown. */
private boolean isAdAvailable() {
  // For time interval details, see: https://support.google.com/admob/answer/9341964
  return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4);
}

Kotlin

/** Check if ad was loaded more than n hours ago. */
private fun wasLoadTimeLessThanNHoursAgo(numHours: Long): Boolean {
  val dateDifference: Long = Date().time - loadTime
  val numMilliSecondsPerHour: Long = 3600000
  return dateDifference < numMilliSecondsPerHour * numHours
}

/** Check if ad exists and can be shown. */
private fun isAdAvailable(): Boolean {
  // For time interval details, see: https://support.google.com/admob/answer/9341964
  return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4)
}

تتبُّع النشاط الحالي

لعرض الإعلان، ستحتاج إلى سياق Activity. لتتبُّع أحدث نشاط يتم استخدامه، عليك التسجيل في Application.ActivityLifecycleCallbacks وتنفيذه.

Java

@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {}

@Override
public void onActivityStarted(@NonNull Activity activity) {
  // An ad activity is started when an ad is showing, which could be AdActivity class from Google
  // SDK or another activity class implemented by a third party mediation partner. Updating the
  // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
  // one that shows the ad.
  if (!appOpenAdManager.isShowingAd) {
    currentActivity = activity;
  }
}

@Override
public void onActivityResumed(@NonNull Activity activity) {}

@Override
public void onActivityPaused(@NonNull Activity activity) {}

@Override
public void onActivityStopped(@NonNull Activity activity) {}

@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}

@Override
public void onActivityDestroyed(@NonNull Activity activity) {}

Kotlin

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}

override fun onActivityStarted(activity: Activity) {
  // An ad activity is started when an ad is showing, which could be AdActivity class from Google
  // SDK or another activity class implemented by a third party mediation partner. Updating the
  // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
  // one that shows the ad.
  if (!appOpenAdManager.isShowingAd) {
    currentActivity = activity
  }
}

override fun onActivityResumed(activity: Activity) {}

override fun onActivityPaused(activity: Activity) {}

override fun onActivityStopped(activity: Activity) {}

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}

override fun onActivityDestroyed(activity: Activity) {}

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

الاستماع إلى أحداث عرض التطبيق في المقدّمة

للاستماع إلى أحداث التطبيق في المقدّمة، اتّبِع الخطوات التالية:

إضافة المكتبات إلى ملف Gradle

لتلقّي إشعارات بشأن أحداث تشغيل التطبيق في المقدّمة، عليك تسجيل DefaultLifecycleObserver. أضِف التبعية إلى ملف الإنشاء على مستوى التطبيق:

Kotlin

  dependencies {
    implementation("com.google.android.gms:play-services-ads:24.5.0")
    implementation("androidx.lifecycle:lifecycle-process:2.8.3")
  }

Groovy

  dependencies {
    implementation 'com.google.android.gms:play-services-ads:24.5.0'
    implementation 'androidx.lifecycle:lifecycle-process:2.8.3'
  }

تنفيذ واجهة مراقب مراحل النشاط

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

نفِّذ onStart() لعرض "الإعلان على شاشة فتح التطبيق".

Java

@Override
public void onStart(@NonNull LifecycleOwner owner) {
  DefaultLifecycleObserver.super.onStart(owner);
  // Show the ad (if available) when the app moves to foreground.
  appOpenAdManager.showAdIfAvailable(currentActivity);
}

Kotlin

override fun onStart(owner: LifecycleOwner) {
  super.onStart(owner)
  currentActivity?.let {
    // Show the ad (if available) when the app moves to foreground.
    appOpenAdManager.showAdIfAvailable(it)
  }
}

عمليات التشغيل الباردة وشاشات التحميل

تفترض المستندات حتى الآن أنّك لا تعرض &quot;الإعلانات على شاشة فتح التطبيق&quot; إلا عندما يفتح المستخدمون تطبيقك في المقدّمة عندما يكون معلّقًا في الذاكرة. تحدث "عمليات التشغيل البارد" عند تشغيل تطبيقك بدون أن يكون قد تم تعليقه مسبقًا في الذاكرة.

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

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

أفضل الممارسات

تساعدك "الإعلانات على شاشة فتح التطبيق" في تحقيق الربح من شاشة التحميل في تطبيقك عند تشغيله لأول مرة وأثناء التبديل بين التطبيقات، ولكن من المهم مراعاة أفضل الممارسات لكي يستمتع المستخدمون باستخدام تطبيقك. إليك أفضل الممارسات:

  • اعرض إعلان فتح التطبيق لأول مرة بعد أن يستخدمه المستخدمون بضع مرات.
  • اعرض "الإعلانات على شاشة فتح التطبيق" في الأوقات التي ينتظر فيها المستخدمون تحميل تطبيقك.
  • إذا كانت لديك شاشة تحميل أسفل "الإعلان على شاشة فتح التطبيق"، واكتمل تحميل شاشة التحميل قبل إغلاق الإعلان، يمكنك إغلاق شاشة التحميل في طريقة onAdDismissedFullScreenContent().

أمثلة على GitHub

  • مثال على "الإعلانات على شاشة فتح التطبيق": Java | Kotlin

الخطوات التالية

يمكنك الاطّلاع على المواضيع التالية: