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

پلتفرم را انتخاب کنید: Android iOS Unity Flutter

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

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

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

پیش نیازها

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

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

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

ca-app-pub-3940256099942544/9257395921

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

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

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

یک کلاس جدید ایجاد کنید که کلاس Application را گسترش دهد. این یک روش آگاه از چرخه حیات برای مدیریت تبلیغاتی است که به جای یک Activity واحد به وضعیت برنامه مرتبط هستند:

جاوا

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();
  }

کاتلین

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 برای کپسوله کردن کارهای مربوط به بارگیری و نمایش تبلیغات Open Open پیاده سازی کنید:

جاوا

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() {}

کاتلین

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() و رسیدگی به تماس های بارگذاری آگهی است.

جاوا

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;
      }
    });

کاتلین

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 با شناسه واحد تبلیغات خود جایگزین کنید.

آگهی را نمایش دهید

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

کد زیر یک تبلیغ را نشان می دهد و سپس مجدداً بارگیری می کند:

جاوا

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);
}

کاتلین

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 ، مطمئن شوید که پاسخ تماس را تنظیم کرده اید:

جاوا

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.");
      }
    });

کاتلین

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 اضافه کنید که بررسی می کند چه مدت از بارگیری مرجع تبلیغ شما گذشته است. سپس، از این روش برای بررسی اینکه آیا تبلیغ هنوز معتبر است یا خیر، استفاده کنید.

جاوا

/** 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);
}

کاتلین

/** 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 را اجرا کنید.

جاوا

@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) {}

کاتلین

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 ثبت کنید. وابستگی آن را به فایل ساخت سطح برنامه خود اضافه کنید:

کاتلین

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

شیار

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

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

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

برای نمایش تبلیغات باز برنامه onStart() را پیاده سازی کنید.

جاوا

@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);
}

کاتلین

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

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

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

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

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

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

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

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

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

مراحل بعدی

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