تبلیغات باز برنامه

این راهنما برای ناشران در نظر گرفته شده است که تبلیغات باز برنامه را با استفاده از Google Mobile Ads SDK یکپارچه می کنند.

تبلیغات باز برنامه یک قالب تبلیغاتی ویژه است که برای ناشرانی که مایل به کسب درآمد از صفحه بارگذاری برنامه خود هستند در نظر گرفته شده است. تبلیغات باز برنامه را می توان در هر زمان بسته کرد و به گونه ای طراحی شده اند که زمانی که کاربران برنامه شما را در پیش زمینه می آورند، نمایش داده می شوند.

آگهی‌های باز برنامه به‌طور خودکار یک منطقه نام تجاری کوچک را نشان می‌دهد تا کاربران بدانند که در برنامه شما هستند. در اینجا نمونه ای از ظاهر یک تبلیغ باز برنامه آمده است:

پیش نیازها

همیشه با تبلیغات آزمایشی تست کنید

هنگام ساخت و آزمایش برنامه های خود، مطمئن شوید که از تبلیغات آزمایشی به جای تبلیغات زنده و تولیدی استفاده می کنید. عدم انجام این کار می تواند منجر به تعلیق حساب شما شود.

ساده ترین راه برای بارگیری تبلیغات آزمایشی استفاده از شناسه واحد آگهی آزمایشی اختصاصی ما برای تبلیغات باز برنامه است:

ca-app-pub-3940256099942544/9257395921

این به‌طور ویژه پیکربندی شده است تا تبلیغات آزمایشی را برای هر درخواست بازگرداند، و شما می‌توانید هنگام کدنویسی، آزمایش و اشکال‌زدایی از آن در برنامه‌های خود استفاده کنید. فقط مطمئن شوید که قبل از انتشار برنامه خود، آن را با شناسه واحد تبلیغاتی خود جایگزین کنید.

برای اطلاعات بیشتر درباره نحوه عملکرد تبلیغات آزمایشی Google Mobile Ads SDK، به فعال کردن تبلیغات آزمایشی مراجعه کنید.

کلاس Application را گسترش دهید

یک کلاس جدید ایجاد کنید که کلاس Application را گسترش دهد و کد زیر را برای مقداردهی اولیه Google Mobile Ads SDK هنگام شروع برنامه اضافه کنید.

جاوا

/** Application class that initializes, loads and show ads when activities change states. */
public class MyApplication extends Application {

  @Override
  public void onCreate() {
    super.onCreate();
    new Thread(
            () -> {
              // Initialize the Google Mobile Ads SDK on a background thread.
              MobileAds.initialize(this, initializationStatus -> {});
            })
        .start();
  }
}

کاتلین

/** Application class that initializes, loads and show ads when activities change states. */
class MyApplication : Application() {

  override fun onCreate() {
    super.onCreate()
    val backgroundScope = CoroutineScope(Dispatchers.IO)
    backgroundScope.launch {
      // Initialize the Google Mobile Ads SDK on a background thread.
      MobileAds.initialize(this@MyApplication) {}
    }
  }
}

این SDK را مقداردهی اولیه می کند و اسکلتی را فراهم می کند که بعداً برای رویدادهای پیش زمینه برنامه ثبت نام می کنید.

سپس کد زیر را به AndroidManifest.xml خود اضافه کنید:

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

جزء ابزاری خود را پیاده سازی کنید

تبلیغ شما باید به سرعت نمایش داده شود، بنابراین بهتر است قبل از نیاز به نمایش آگهی خود، آن را بارگیری کنید. به این ترتیب، به محض ورود کاربر به اپلیکیشن شما، یک تبلیغ آماده خواهید داشت.

یک جزء ابزار AppOpenAdManager برای درخواست تبلیغات قبل از زمانی که نیاز به نمایش آگهی دارید، پیاده سازی کنید.

جاوا

public class MyApplication extends Application {
  // ...
  /** Inner class that loads and shows app open ads. */
  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;

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

    /** Request an ad. */
    private void loadAd(Context context) {
      // We will implement this later.
    }

    /** Check if ad exists and can be shown. */
    private boolean isAdAvailable() {
      return appOpenAd != null;
    }
  }
}

کاتلین

private const val String LOG_TAG = "AppOpenAdManager"
private const val String AD_UNIT_ID = "ca-app-pub-3940256099942544/9257395921"

public class MyApplication extends Application {
  // ...
  /** Inner class that loads and shows app open ads. */
  private inner class AppOpenAdManager {
    private var appOpenAd: AppOpenAd? = null
    private var isLoadingAd = false
    var isShowingAd = false

    /** Request an ad. */
    fun loadAd(context: Context) {
      // We will implement this later.
    }

    /** Check if ad exists and can be shown. */
    private fun isAdAvailable(): Boolean {
      return appOpenAd != null
    }
  }
}

اکنون که یک کلاس کاربردی دارید، می توانید آن را در کلاس MyApplication خود نمونه سازی کنید:

جاوا

public class MyApplication extends Application {

  private AppOpenAdManager appOpenAdManager;

  @Override
  public void onCreate() {
    super.onCreate();
    new Thread(
            () -> {
              // Initialize the Google Mobile Ads SDK on a background thread.
              MobileAds.initialize(this, initializationStatus -> {});
            })
        .start();
    appOpenAdManager = new AppOpenAdManager(this);
  }
}

کاتلین

class MyApplication : Application() {

  private lateinit var appOpenAdManager: AppOpenAdManager

  override fun onCreate() {
    super.onCreate()
    val backgroundScope = CoroutineScope(Dispatchers.IO)
    backgroundScope.launch {
      // Initialize the Google Mobile Ads SDK on a background thread.
      MobileAds.initialize(this@MyApplication) {}
    }
    appOpenAdManager = AppOpenAdManager()
  }
}

یک تبلیغ را بارگیری کنید

مرحله بعدی پر کردن متد loadAd() و رسیدگی به تماس های بارگذاری آگهی است.

جاوا

private class AppOpenAdManager {
  // ...
  /** Request an ad. */
  public void loadAd(Context context) {
    // Do not load ad if there is an unused ad or one is already loading.
    if (isLoadingAd || isAdAvailable()) {
      return;
    }

    isLoadingAd = true;
    AdRequest request = new AdRequest.Builder().build();
    AppOpenAd.load(
        context, AD_UNIT_ID, request,
        AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT,
        new AppOpenAdLoadCallback() {
          @Override
          public void onAdLoaded(AppOpenAd ad) {
            // Called when an app open ad has loaded.
            Log.d(LOG_TAG, "Ad was 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, loadAdError.getMessage());
            isLoadingAd = false;
          }
        });
  }
  // ...
}

کاتلین

private inner class AppOpenAdManager {
  // ...
  /** Request an ad. */
  fun loadAd(context: Context) {
    // Do not load ad if there is an unused ad or one is already loading.
    if (isLoadingAd || isAdAvailable()) {
      return
    }

    isLoadingAd = true
    val request = AdRequest.Builder().build()
    AppOpenAd.load(
        context, AD_UNIT_ID, request,
        AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT,
        object : AppOpenAdLoadCallback() {

          override fun onAdLoaded(ad: AppOpenAd) {
            // Called when an app open ad has loaded.
            Log.d(LOG_TAG, "Ad was 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, loadAdError.message)
            isLoadingAd = false;
          }
        })
  }
  // ...
}

نمایش آگهی و مدیریت رویدادهای پاسخ به تماس تمام صفحه

رایج‌ترین اجرای برنامه باز این است که سعی کنید یک تبلیغ باز برنامه را در نزدیکی راه‌اندازی برنامه نشان دهید، محتوای برنامه را در صورت آماده نبودن آن شروع کنید و آگهی دیگری را برای فرصت باز برنامه بعدی از قبل بارگذاری کنید. برای مثال‌های پیاده‌سازی ، راهنمای تبلیغات باز برنامه را ببینید.

کد زیر نحوه نمایش و بارگذاری مجدد آگهی را نشان می دهد:

جاوا

public class MyApplication extends Application {
  // ...
  /** Interface definition for a callback to be invoked when an app open ad is complete. */
  public interface OnShowAdCompleteListener {
    void onShowAdComplete();
  }

  private class AppOpenAdManager {
    // ...

    /** Shows the ad if one isn't already showing. */
    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(LOG_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 (!isAdAvailable()) {
        Log.d(LOG_TAG, "The app open ad is not ready yet.");
        onShowAdCompleteListener.onShowAdComplete();
        loadAd(activity);
        return;
      }

      appOpenAd.setFullScreenContentCallback(
          new FullScreenContentCallback() {

            @Override
            public void onAdDismissedFullScreenContent() {
              // Called when fullscreen content is dismissed.
              // Set the reference to null so isAdAvailable() returns false.
              Log.d(LOG_TAG, "Ad dismissed fullscreen content.");
              appOpenAd = null;
              isShowingAd = false;

              onShowAdCompleteListener.onShowAdComplete();
              loadAd(activity);
            }

            @Override
            public void onAdFailedToShowFullScreenContent(AdError adError) {
              // Called when fullscreen content failed to show.
              // Set the reference to null so isAdAvailable() returns false.
              Log.d(LOG_TAG, adError.getMessage());
              appOpenAd = null;
              isShowingAd = false;

              onShowAdCompleteListener.onShowAdComplete();
              loadAd(activity);
            }

            @Override
            public void onAdShowedFullScreenContent() {
              // Called when fullscreen content is shown.
              Log.d(LOG_TAG, "Ad showed fullscreen content.");
            }
          });
      isShowingAd = true;
      appOpenAd.show(activity);
    }
    // ...
  }
}

کاتلین

class MyApplication : Application() {
  // ...
  /** Interface definition for a callback to be invoked when an app open ad is complete. */
  interface OnShowAdCompleteListener {
    fun onShowAdComplete()
  }

  private inner class AppOpenAdManager {
    // ...

    /** Shows the ad if one isn't already showing. */
    fun showAdIfAvailable(
        activity: Activity,
        onShowAdCompleteListener: OnShowAdCompleteListener) {
      // If the app open ad is already showing, do not show the ad again.
      if (isShowingAd) {
        Log.d(LOG_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 (!isAdAvailable()) {
        Log.d(LOG_TAG, "The app open ad is not ready yet.")
        onShowAdCompleteListener.onShowAdComplete()
        loadAd(activity)
        return
      }

      appOpenAd?.setFullScreenContentCallback(
          object : FullScreenContentCallback() {

            override fun onAdDismissedFullScreenContent() {
              // Called when full screen content is dismissed.
              // Set the reference to null so isAdAvailable() returns false.
              Log.d(LOG_TAG, "Ad dismissed fullscreen content.")
              appOpenAd = null
              isShowingAd = false

              onShowAdCompleteListener.onShowAdComplete()
              loadAd(activity)
            }

            override fun onAdFailedToShowFullScreenContent(adError: AdError) {
              // Called when fullscreen content failed to show.
              // Set the reference to null so isAdAvailable() returns false.
              Log.d(LOG_TAG, adError.message)
              appOpenAd = null
              isShowingAd = false

              onShowAdCompleteListener.onShowAdComplete()
              loadAd(activity)
            }

            override fun onAdShowedFullScreenContent() {
              // Called when fullscreen content is shown.
              Log.d(LOG_TAG, "Ad showed fullscreen content.")
            }
          })
      isShowingAd = true
      appOpenAd?.show(activity)
    }
    // ...
  }
}

FullScreenContentCallback رویدادهایی مانند زمانی که تبلیغ ارائه می‌شود، نمایش داده نمی‌شود یا زمانی که رد می‌شود مدیریت می‌کند.

انقضای آگهی را در نظر بگیرید

برای اطمینان از اینکه تبلیغ منقضی شده ای را نشان نمی دهید، روشی را به AppOpenAdManager اضافه کنید که بررسی می کند چقدر از زمان بارگیری مرجع تبلیغ شما گذشته است. سپس، از این روش برای بررسی اینکه آیا تبلیغ هنوز معتبر است یا خیر، استفاده کنید.

جاوا

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

  // ...

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

  /** Check if ad exists and can be shown. */
  public boolean isAdAvailable() {
    return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4);
  }
}

کاتلین

private inner class AppOpenAdManager {
  // ...
  /** 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;

  // ...

  /** Utility method to 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 {
    return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4)
  }
}

فعالیت فعلی را پیگیری کنید

برای نمایش آگهی، به یک زمینه Activity نیاز دارید. برای پیگیری آخرین فعالیت های مورد استفاده، ثبت نام کنید و Application.ActivityLifecycleCallbacks اجرا کنید.

جاوا

public class MyApplication extends Application implements ActivityLifecycleCallbacks {

  private Activity currentActivity;

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

  /** ActivityLifecycleCallback methods. */
  @Override
  public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}

  @Override
  public void onActivityStarted(Activity activity) {
    currentActivity = activity
  }

  @Override
  public void onActivityResumed(Activity activity) {}

  @Override
  public void onActivityStopped(Activity activity) {}

  @Override
  public void onActivityPaused(Activity activity) {}

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

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

کاتلین

class MyApplication : Application(), Application.ActivityLifecycleCallbacks {

  private var currentActivity: Activity? = null

  override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(this)
    // ...
  }

  /** ActivityLifecycleCallback methods. */
  override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}

  override fun onActivityStarted(activity: Activity) {
    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 ثبت کنید. وابستگی آن را به فایل ساخت سطح برنامه خود اضافه کنید:

کاتلین

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

شیار

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

رابط ناظر چرخه حیات را پیاده سازی کنید

می توانید با اجرای رابط DefaultLifecycleObserver به رویدادهای پیش زمینه گوش دهید.

رویداد onStart را برای نمایش آگهی باز برنامه اجرا کنید.

جاوا

public class MyApplication extends Application
    implements ActivityLifecycleCallbacks, LifecycleObserver {
  // ...
  @Override
  public void onCreate() {
    super.onCreate();
    this.registerActivityLifecycleCallbacks(this);
    new Thread(
            () -> {
              // Initialize the Google Mobile Ads SDK on a background thread.
              MobileAds.initialize(this, initializationStatus -> {});
            })
        .start();
    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    appOpenAdManager = new AppOpenAdManager();
  }

  /** LifecycleObserver method that shows the app open ad when the app moves to foreground. */
  @OnLifecycleEvent(Event.ON_START)
  protected void onMoveToForeground() {
    // Show the ad (if available) when the app moves to foreground.
    appOpenAdManager.showAdIfAvailable(currentActivity);
  }

  /** Show the ad if one isn't already showing. */
  private void showAdIfAvailable(@NonNull final Activity activity) {
      showAdIfAvailable(
          activity,
          new OnShowAdCompleteListener() {
            @Override
            public void onShowAdComplete() {
              // Empty because the user will go back to the activity that shows the ad.
            }
          });
  }
}

کاتلین

class MyApplication : Application(),
    Application.ActivityLifecycleCallbacks, LifecycleObserver {
  // ...
  override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(this)
    val backgroundScope = CoroutineScope(Dispatchers.IO)
    backgroundScope.launch {
      // Initialize the Google Mobile Ads SDK on a background thread.
      MobileAds.initialize(this@MyApplication) {}
    }
    ProcessLifecycleOwner.get().lifecycle.addObserver(this)
    appOpenAdManager = AppOpenAdManager()
  }

  /** LifecycleObserver method that shows the app open ad when the app moves to foreground. */
  @OnLifecycleEvent(Lifecycle.Event.ON_START)
  fun onMoveToForeground() {
    // Show the ad (if available) when the app moves to foreground.
    currentActivity?.let {
      appOpenAdManager.showAdIfAvailable(it)
    }
  }

  /** Show the ad if one isn't already showing. */
  fun showAdIfAvailable(activity: Activity) {
    showAdIfAvailable(
        activity,
        object : OnShowAdCompleteListener {
          override fun onShowAdComplete() {
            // Empty because the user will go back to the activity that shows the ad.
          }
        })
  }
}

صفحه نمایش های شروع و بارگذاری سرد

مستندات تا کنون فرض می‌کنند که شما فقط زمانی تبلیغات باز برنامه را نشان می‌دهید که کاربران برنامه شما را در جلوی تصویر قرار می‌دهند، زمانی که در حافظه تعلیق شده باشد. "شروع سرد" زمانی رخ می دهد که برنامه شما راه اندازی می شود اما قبلاً در حافظه تعلیق نشده بود.

یک مثال از شروع سرد زمانی است که کاربر برای اولین بار برنامه شما را باز می کند. با شروع سرد، آگهی باز برنامه بارگیری شده قبلی که فوراً آماده نمایش باشد، نخواهید داشت. تأخیر بین درخواست تبلیغ و دریافت مجدد آگهی می‌تواند موقعیتی را ایجاد کند که کاربران بتوانند قبل از غافلگیری از یک آگهی خارج از زمینه، به طور خلاصه از برنامه شما استفاده کنند. این باید اجتناب شود زیرا تجربه کاربری بدی است.

روش ترجیحی برای استفاده از تبلیغات باز برنامه در شروع سرد این است که از صفحه بارگیری برای بارگیری دارایی های بازی یا برنامه خود استفاده کنید و فقط تبلیغ را از صفحه بارگیری نشان دهید. اگر برنامه شما بارگیری کامل شده است و کاربر را به محتوای اصلی برنامه شما فرستاده است، تبلیغ را نشان ندهید.

بهترین شیوه ها

تبلیغات باز برنامه به شما کمک می کند تا از صفحه بارگیری برنامه خود کسب درآمد کنید، در اولین راه اندازی برنامه و در حین جابجایی برنامه، اما مهم است که بهترین شیوه ها را در نظر داشته باشید تا کاربران از استفاده از برنامه شما لذت ببرند. بهتر است:

  • اولین تبلیغ باز برنامه خود را بعد از اینکه کاربران چند بار از برنامه شما استفاده کردند نشان دهید.
  • تبلیغات باز برنامه را در مواقعی نشان دهید که کاربران شما در غیر این صورت منتظر بارگیری برنامه شما هستند.
  • اگر صفحه بارگیری زیر آگهی باز برنامه دارید و صفحه بارگیری شما قبل از رد شدن آگهی بارگیری کامل می شود، ممکن است بخواهید صفحه بارگیری خود را با روش onAdDismissedFullScreenContent() رد کنید.

نمونه هایی در GitHub

مراحل بعدی

موضوعات زیر را بررسی کنید: