فرمت‌های تبلیغاتی بومی سفارشی

علاوه بر قالب‌های بومی تعریف‌شده توسط سیستم، ناشران Ad Manager این امکان را دارند که با تعریف لیست‌های سفارشی از دارایی‌ها، قالب‌های بومی تبلیغات خود را ایجاد کنند. این قالب‌ها، قالب‌های بومی سفارشی تبلیغات نامیده می‌شوند و می‌توانند با تبلیغات رزرو شده استفاده شوند. این امر ناشران را قادر می‌سازد تا داده‌های ساختاریافته دلخواه را به برنامه‌های خود منتقل کنند. این تبلیغات توسط شیء NativeCustomFormatAd نمایش داده می‌شوند.

بارگذاری قالب‌های تبلیغاتی بومی سفارشی

این راهنما نحوه بارگذاری و نمایش قالب‌های سفارشی تبلیغات بومی را توضیح می‌دهد.

یک تبلیغ بومی سفارشی بارگذاری کنید

برای بارگذاری یک تبلیغ بومی سفارشی، موارد زیر را انجام دهید:

  1. نوع NativeAdType.CUSTOM_NATIVE را به عنوان یک نوع تبلیغ در NativeAdRequest وارد کنید.

  2. شناسه قالب تبلیغ بومی سفارشی را تنظیم کنید.

کاتلین

val adRequest =
  NativeAdRequest.Builder("AD_UNIT_ID", listOf(NativeAdType.CUSTOM_NATIVE))
    .setCustomFormatIds(listOf("CUSTOM_NATIVE_FORMAT_ID"))
    .build()

// Load the native ad with the ad request and callback.
NativeAdLoader.load(
  adRequest,
  object : NativeAdLoaderCallback {
    override fun onCustomNativeAdLoaded(customNativeAd: CustomNativeAd) {
      // TODO: Store the custom native ad.
    }

    override fun onAdFailedToLoad(adError: LoadAdError) {}
  },
)

جاوا

NativeAdRequest adRequest =
    new NativeAdRequest.Builder("AD_UNIT_ID", List.of(NativeAd.NativeAdType.CUSTOM_NATIVE))
        .setCustomFormatIds(Arrays.asList("CUSTOM_NATIVE_FORMAT_ID"))
        .build();

// Load the native ad with the ad request and callback.
NativeAdLoader.load(
    adRequest,
    new NativeAdLoaderCallback() {
      @Override
      public void onCustomNativeAdLoaded(@NonNull CustomNativeAd customNativeAd) {
        // TODO: Store the custom native ad.
      }

      @Override
      public void onAdFailedToLoad(@NonNull LoadAdError adError) {}
    });

شناسه قالب تبلیغات بومی سفارشی

شناسه قالب مورد استفاده برای شناسایی قالب تبلیغات بومی سفارشی را می‌توانید در رابط کاربری مدیریت تبلیغات، زیر بخش بومی ، درون منوی کشویی تحویل (Delivery) پیدا کنید:

شناسه هر قالب تبلیغاتی بومی سفارشی در کنار نام آن ظاهر می‌شود. کلیک بر روی یکی از نام‌ها شما را به صفحه جزئیات می‌برد که اطلاعات مربوط به فیلدهای قالب را نشان می‌دهد:

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

نمایش فرمت‌های سفارشی تبلیغات بومی

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

  1. فایل‌های متنی و تصویری از طریق getText() و getImage() که نام فیلد را به عنوان پارامتر می‌گیرند، در دسترس هستند.
  2. از آنجا که هیچ کلاس ViewGroup اختصاصی برای ثبت در گوگل وجود ندارد، باید تعداد نمایش‌ها و کلیک‌ها را به صورت دستی ثبت کنید.
  3. اگر تبلیغ حاوی محتوای ویدیویی نباشد، یک تبلیغ بومی سفارشی محتوای رسانه‌ای null دارد.

این مثال به شما نشان می‌دهد که چگونه یک CustomNativeAd نمایش دهید:

کاتلین

private fun displayCustomNativeAd(customNativeAd: CustomNativeAd, context: Context) {
  // Render the text elements.

  // The `customNativeAdBinding` is the layout binding for the ad container that
  // contains all `CustomNativeAd` assets.
  customNativeAdBinding.headline.text = customNativeAd.getText("Headline")
  customNativeAdBinding.caption.text = customNativeAd.getText("Caption")

  // If the main asset is an image, render it with an ImageView.
  val imageView = ImageView(context)
  imageView.adjustViewBounds = true
  imageView.setImageDrawable(customNativeAd.getImage("MainImage")?.drawable)
  imageView.setOnClickListener { customNativeAd.performClick("MainImage") }
  customNativeAdBinding.mediaPlaceholder.addView(imageView)

  // Render the ad choices icon.
  renderAdChoices(customNativeAd)

  // Record an impression.
  customNativeAd.recordImpression()
}

جاوا

private void displayCustomNativeAd(CustomNativeAd customNativeAd, Context context) {
  // Render the text elements.

  // The `customNativeAdBinding` is the layout binding for the ad container that
  // contains all `CustomNativeAd` assets.
  if (customNativeAdBinding != null) {
    customNativeAdBinding.headline.setText(customNativeAd.getText("Headline"));
    customNativeAdBinding.caption.setText(customNativeAd.getText("Caption"));

    ImageView imageView = new ImageView(context);
    imageView.setAdjustViewBounds(true);
    imageView.setImageDrawable(customNativeAd.getImage("MainImage").getDrawable());
    imageView.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            customNativeAd.performClick("MainImage");
          }
        });
    customNativeAdBinding.mediaPlaceholder.addView(imageView);

    // Render the ad choices icon.
    renderAdChoices(customNativeAd);

    // Record an impression.
    customNativeAd.recordImpression();
  }
}

ویدیوی بومی برای قالب‌های سفارشی تبلیغات بومی

هنگام ایجاد یک قالب سفارشی ، می‌توانید قالب را برای ویدیو واجد شرایط کنید.

در پیاده‌سازی برنامه‌تان، می‌توانید از CustomNativeAd.getMediaContent() برای دریافت محتوای رسانه استفاده کنید. سپس setMediaContent() برای تنظیم محتوای رسانه در نمای رسانه خود فراخوانی کنید. اگر محتوای رسانه تبلیغ null است، برنامه‌های جایگزینی برای نمایش تبلیغ بدون ویدیو در نظر بگیرید.

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

کاتلین

private fun displayVideoCustomNativeAd(customNativeAd: CustomNativeAd, context: Context) {
  // Check whether the custom native ad has video content.
  val mediaContent = customNativeAd.mediaContent
  if (mediaContent != null && mediaContent.hasVideoContent) {
    // Render the media content in a MediaView.
    val mediaView = MediaView(context)
    mediaView.mediaContent = mediaContent
    customNativeAdBinding.mediaPlaceholder.addView(mediaView)
  } else {
    // Fall back to other assets defined on your custom native ad.
    val imageView = ImageView(context)
    imageView.adjustViewBounds = true
    imageView.setImageDrawable(customNativeAd.getImage("MainImage")?.drawable)
    customNativeAdBinding.mediaPlaceholder.addView(imageView)
  }

  // Record an impression.
  customNativeAd.recordImpression()
}

جاوا

private void displayVideoCustomNativeAd(CustomNativeAd customNativeAd, Context context) {
  // Check whether the custom native ad has video content.
  MediaContent mediaContent = customNativeAd.getMediaContent();
  if (mediaContent != null && mediaContent.getHasVideoContent()) {
    // Render the media content in a MediaView.
    MediaView mediaView = new MediaView(context);
    mediaView.setMediaContent(mediaContent);
    customNativeAdBinding.mediaPlaceholder.addView(mediaView);
  } else {
    // Fall back to other assets defined on your custom native ad.
    ImageView imageView = new ImageView(context);
    imageView.setAdjustViewBounds(true);
    imageView.setImageDrawable(customNativeAd.getImage("MainImage").getDrawable());
    customNativeAdBinding.mediaPlaceholder.addView(imageView);
  }

  // Record an impression.
  customNativeAd.recordImpression();
}

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

نماد AdChoices را رندر کنید

به عنوان بخشی از قانون حمایت از خدمات دیجیتال (DSA) ، تبلیغات رزرو شده در منطقه اقتصادی اروپا (EEA) نیاز به یک آیکون AdChoices و پیوندی به صفحه «درباره این تبلیغ» گوگل دارند. هنگام پیاده‌سازی تبلیغات بومی سفارشی، شما مسئول رندر آیکون AdChoices هستید. توصیه می‌کنیم هنگام رندر کردن دارایی‌های اصلی تبلیغ، مراحل رندر و تنظیم شنونده کلیک برای آیکون AdChoices را انجام دهید.

مثال زیر فرض می‌کند که شما یک عنصر <ImageView /> در سلسله مراتب view خود تعریف کرده‌اید تا لوگوی AdChoices را در خود نگه دارد.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:id="@+id/adChoices"
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:adjustViewBounds="true"
        android:contentDescription="AdChoices icon." />
</LinearLayout>

مثال‌های زیر آیکون AdChoices را رندر کرده و رفتار کلیک مناسب را پیکربندی می‌کنند.

کاتلین

private fun renderAdChoices(customNativeAd: CustomNativeAd) {
  // Render the AdChoices image.
  val adChoiceAsset = customNativeAd.getImage(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW)
  if (adChoiceAsset != null) {
    customNativeAdBinding.adchoices.setImageDrawable(adChoiceAsset.drawable)
    customNativeAdBinding.adchoices.visibility = View.VISIBLE
    customNativeAdBinding.adchoices.setOnClickListener {
      // Handle click. See the next section for more details.
      customNativeAd.performClick(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW)
    }
  } else {
    customNativeAdBinding.adchoices.visibility = View.GONE
  }
}

جاوا

private void renderAdChoices(CustomNativeAd customNativeAd) {
  // Render the AdChoices image.
  Image adChoiceAsset =
      customNativeAd.getImage(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW);
  if (adChoiceAsset != null) {
    if (customNativeAdBinding != null) {
      customNativeAdBinding.adchoices.setImageDrawable(adChoiceAsset.getDrawable());
      customNativeAdBinding.adchoices.setVisibility(View.VISIBLE);
      customNativeAdBinding.adchoices.setOnClickListener(
          new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              // Handle click.
              customNativeAd.performClick(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW);
            }
          });
    }
  } else {
    if (customNativeAdBinding != null) {
      customNativeAdBinding.adchoices.setVisibility(View.GONE);
    }
  }
}

ثبت نمایش‌ها و گزارش کلیک‌ها

برنامه شما مسئول ثبت نمایش‌ها و گزارش رویدادهای کلیک به GMA Next Gen SDK است.

ثبت برداشت‌ها

برای ثبت نمایش یک تبلیغ بومی سفارشی، متد recordImpression() مربوط به تبلیغ را فراخوانی کنید:

کاتلین

// Record an impression.
customNativeAd.recordImpression()

جاوا

// Record an impression.
customNativeAd.recordImpression();

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

گزارش کلیک‌ها

برای گزارش به SDK مبنی بر اینکه کلیکی روی نمای دارایی رخ داده است، متد performClick() تبلیغ را فراخوانی کنید. نام دارایی که روی آن کلیک شده است را با استفاده از همان رشته‌ای که در رابط کاربری مدیر تبلیغات تعریف کرده‌اید، ارائه دهید.

کاتلین

imageView.setOnClickListener { customNativeAd.performClick("MainImage") }

جاوا

imageView.setOnClickListener(
    new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        customNativeAd.performClick("MainImage");
      }
    });

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

پاسخ به اقدامات کلیک سفارشی

وقتی روی یک تبلیغ با فرمت سفارشی کلیک می‌شود، سه پاسخ ممکن از SDK وجود دارد که به ترتیب زیر امتحان می‌شوند:

  1. اگر OnCustomClickListener ارائه شده باشد، آن را فراخوانی کنید.
  2. برای هر یک از URL های لینک عمیق تبلیغ، سعی کنید یک حل کننده محتوا پیدا کنید و اولین موردی را که حل می کند، شروع کنید.
  3. یک مرورگر باز کنید و به آدرس اینترنتی (URL) مقصد تبلیغ بروید.

برای پیاده‌سازی یک عمل کلیک سفارشی، یک OnCustomClickListener ارائه دهید:

کاتلین

customNativeAd.onCustomClickListener =
  object : OnCustomClickListener {
    override fun onCustomClick(assetName: String) {
      // Perform your custom action.
    }
  }

جاوا

customNativeAd.setOnCustomClickListener(
    new OnCustomClickListener() {
      @Override
      public void onCustomClick(@NonNull String assetName) {
        // Perform your custom action.
      }
    });

در ابتدا، ممکن است عجیب به نظر برسد که شنونده‌های کلیک سفارشی وجود دارند. از این گذشته، برنامه شما همین الان به SDK گفته است که یک کلیک اتفاق افتاده است، پس چرا SDK باید این را به برنامه گزارش دهد؟

این جریان اطلاعات به چند دلیل مفید است، اما مهم‌تر از همه، به SDK اجازه می‌دهد تا کنترل پاسخ به کلیک را در دست داشته باشد. به عنوان مثال، می‌تواند به طور خودکار URL های ردیابی شخص ثالث را که برای خلاقیت تنظیم شده‌اند، پینگ کند و سایر وظایف را در پشت صحنه، بدون هیچ کد اضافی انجام دهد.