Перейти к основному содержимому
осторожно
Android SDK 3.0.2 устарела. Stable версия - здесь.
Версия: 3.0.2

Нативная реклама

Нативная реклама - гибкий тип рекламы, стиль и вид которой вы можете адаптировать под контент вашего приложения.

Вы можете использовать наше демо приложение в качестве примера по интеграции.

Demo App

Кеширование​

Для кеширования нативной рекламы используйте следющий метод:

Appodeal.cache(this, Appodeal.NATIVE)

Для кеширования конкретного количества нативной рекламы используйте следующий метод:

Appodeal.cache(this, Appodeal.NATIVE, 3)
к сведению

Указание количества нативной рекламы при кешировании не гарантирует, что указанное количество будет загружено.

Проверка Загрузки​

Appodeal.isLoaded(Appodeal.NATIVE)

Получение Экземпляра Загруженной Нативной Рекламы​

Чтобы получить загруженную нативную рекламу используйте следующий метод:

val nativeAds: List<NativeAd> = Appodeal.getNativeAds(amount)
примечание

Как только вы получите список с нативной рекламой, он будет удален из кеша Appodeal SDK.

Методы Обратного Вызова​

Appodeal.setNativeCallbacks(object : NativeCallbacks {
override fun onNativeLoaded() {
// Called when native ads are loaded
}
override fun onNativeFailedToLoad() {
// Called when native ads are failed to load
}
override fun onNativeShown(NativeAd nativeAd) {
// Called when native ad is shown
}
override fun onNativeShowFailed(NativeAd nativeAd) {
// Called when native ad show failed
}
override fun onNativeClicked(NativeAd nativeAd) {
// Called when native ads is clicked
}
override fun onNativeExpired() {
// Called when native ads is expired
}
})
к сведению

Вcе callback методы вызываются в главном потоке.

Ручное Кеширование​

Чтобы отключить автоматическое кеширование для нативной рекламы, вызовите следующий код до инициализации SDK:

Appodeal.setAutoCache(Appodeal.NATIVE, false)

Более подробную информацию о ручном кешировании рекламы вы можете найти в нашем FAQ.

Получение Количества Доступной Нативной Рекламы​

Appodeal.getAvailableNativeAdsCount()

Объект NativeAd​

После загрузки нативных объявлений вы можете получить список объектов NativeAd, вызвав Appodeal.getNativeAds().

МетодТипОбязателенОписание
nativeAd.titleStringОбязателенЗаголовок нативной рекламы. Всегда должно отображаться не более 25 символов заголовка. Вы можете добавить многоточие в конце, если заголовок длиннее.
nativeAd.callToActionStringОбязателенТекст Call-to-action кнопки. Должен отображаться полный заголовок кнопки.
nativeAd.descriptionStringОпционаленТекстовое описание нативного объявления. Если вы решите отобразить описание, оно должно содержать не более 100 символов. Вы можете добавить многоточие в конце.
nativeAd.ratingFloatОпционаленРейтинг приложения в диапазоне [0-5]
nativeAd.ageRestrictionsStringОпционаленВозрастное ограничение рекламируемого приложения. Может возвращать null.
nativeAd.adProviderStringОпционаленИмя провайдера нативной рекламы.
nativeAd.getProviderView(context: Context)ViewОбязателенЕсли он не возвращает null, то в любом углу нативного объявления обязательно отображается значок провайдера. Используется некоторыми сетями для отображения AdChoices или значка конфиденциальности.
nativeAd.containsVideo()BooleanОпционаленВозвращает true, если объект NativeAd содержит видео.
nativeAd.canShow(placementName: String)BooleanОпционаленПроверяет, может ли нативная реклама быть показана для указанного плейсмента.
nativeAd.isPrecacheBooleanОпционаленПроверяет, является ли загруженная реклама прекэшем.
nativeAd.predictedEcpmDoubleОпционаленВозвращает прогнозируемое значение ecpm.
nativeAd.destroy()UnitОбязателенУничтожает нативную рекламы и прекращает ее отслеживание.

Настройка

Кэширование Ресурсов Нативной Рекламы​

Задайте ресурсы для нативной рекламы, необходимые для показа. Значение по умолчанию - ALL.

//assets caching for NativeIconView and NativeMediaView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ALL)
//assets caching only for NativeIconView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ICON)
//assets caching only for NativeMediaView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.IMAGE)

Нативная Видеореклама​

Для показа нативного видео необходимо использовать NativeMediaView. В случае отсутствия видео в объекте NativeAd, автоматически отобразится главное изображение.

val adView: NativeAdView = findViewById(R.id.native_layout)
val nativeMediaView: NativeMediaView = adView.findViewById(R.id.appodeal_media_view_content)
if (nativeAd.containsVideo()) {
adView.nativeMediaView = nativeMediaView;
} else {
nativeMediaView.visibility = View.GONE;
}

Настойки Нативной Видеорекламы​

Для управления нативной видеорекламой используйте следующие методы:

// both static image and video native ads will be loaded
Appodeal.setNativeAdType(Native.NativeAdType.Auto)
// only static image native ads will be loaded
Appodeal.setNativeAdType(Native.NativeAdType.NoVideo)
// only video native ads will be loaded.
Appodeal.setNativeAdType(Native.NativeAdType.Video)

Шаблоны​

Appodeal SDK предоставляет 3 вида шаблонов для нативной рекламы:

  • NativeAdViewNewsFeed;
  • NativeAdViewAppWall;
  • NativeAdViewContentStream.

Если вы хотите использовать один из этих шаблонов, Вы можете добавить выбранный шаблон в разметку:

XML
<com.appodeal.ads.native_ad.views.NativeAdViewNewsFeed
android:id="@+id/native_ad_view_news_feed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
</com.appodeal.ads.native_ad.views.NativeAdViewNewsFeed>

<com.appodeal.ads.native_ad.views.NativeAdViewAppWall
android:id="@+id/native_ad_view_app_wall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
</com.appodeal.ads.native_ad.views.NativeAdViewAppWall>

<com.appodeal.ads.native_ad.views.NativeAdViewContentStream
android:id="@+id/native_ad_view_content_stream"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
</com.appodeal.ads.native_ad.views.NativeAdViewContentStream>

Для показа рекламы используйте:

val nav_nf: NativeAdViewNewsFeed = mActivity.findViewById(R.id.native_ad_view_news_feed)
nav_nf.setNativeAd(mNativeAd)

val nav_aw: NativeAdViewAppWall = mActivity.findViewById(R.id.native_ad_view_app_wall)
nav_aw.setNativeAd(mNativeAd)

val nav_cs: NativeAdViewContentStream = mActivity.findViewById(R.id.native_ad_view_content_stream)
nav_cs.setNativeAd(mNativeAd)

Вы также можете создать View для отображения рекламы программно:

val holder: RelativeLayout = mActivity.findViewById(R.id.native_template_holder)
val nativeAdView = NativeAdViewAppWall(mActivity, mNativeAd)
holder.addView(nativeAdView)

Элементы Шаблона​

val title: TextView = getTitleView()
val description: TextView = getDescriptionView()
val rating: View = getRatingView()
val ratingBar: RatingBar = getRatingBar()
val providerView: View = getProviderView()
val callToAction: TextView = getCallToActionView()
val iconView: NativeIconView = getNativeIconView()
val mediaView: NativeMediaView = getNativeMediaView()

По умолчанию нативная реклама помечается как «Ad». Вы можете заменить эту метку на «Sponsored»:

nav.showSponsored(true);

Для изменения цвета кнопки действия в шаблонах используйте:

nav.setCallToActionColor(color: Integer)
nav.setCallToActionColor(color: String)

Использование Собственной Разметки​

val nativeAdView: NativeAdView = findViewById(R.id.native_layout)
val tvTitle: TextView = nativeAdView.findViewById(R.id.tv_title)
tvTitle.text = nativeAd.title
nativeAdView.titleView = tvTitle
val tvDescription: TextView = nativeAdView.findViewById(R.id.tv_description)
tvDescription.text = nativeAd.description
nativeAdView.descriptionView = tvDescription
val ratingBar: RatingBar = nativeAdView.findViewById(R.id.rb_rating)
if (nativeAd.rating == 0.0f) {
ratingBar.visibility = View.INVISIBLE
} else {
ratingBar.visibility = View.VISIBLE
ratingBar.rating = nativeAd.rating
ratingBar.stepSize = 0.1f
}
nativeAdView.ratingView = ratingBar
val ctaButton: Button = nativeAdView.findViewById(R.id.b_cta)
ctaButton.text = nativeAd.callToAction
nativeAdView.callToActionView = ctaButton
val providerView: View? = nativeAd.getProviderView(context)
if (providerView != null) {
if (providerView.parent != null && providerView.parent is ViewGroup) {
(providerView.parent as ViewGroup).removeView(providerView)
}
val providerViewContainer: FrameLayout =
nativeAdView.findViewById(R.id.provider_view)
val layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
providerViewContainer.addView(providerView, layoutParams)
}
nativeAdView.providerView = providerView
val tvAgeRestrictions: TextView = nativeAdView.findViewById(R.id.tv_age_restriction)
if (nativeAd.ageRestrictions != null) {
tvAgeRestrictions.text = nativeAd.ageRestrictions
tvAgeRestrictions.visibility = View.VISIBLE
} else {
tvAgeRestrictions.visibility = View.GONE
}
val nativeIconView: NativeIconView = nativeAdView.findViewById(R.id.icon)
nativeAdView.setNativeIconView(nativeIconView)
val nativeMediaView: NativeMediaView = nativeAdView.findViewById(R.id.appodeal_media_view_content)
nativeAdView.nativeMediaView = nativeMediaView
nativeAdView.registerView(nativeAd)
подсказка

Чтобы отобразить NativeAd в своей собственной разметке, используйте NativeAdView, наполните и свяжите View ресурсы.

Привяжите View ресурсы к NativeAdView:

nativeAdView.titleView = view: View
nativeAdView.callToActionView = view: View
nativeAdView.ratingView = view: View
nativeAdView.descriptionView = view: View
nativeAdView.providerView = view: View
nativeAdView.setNativeIconView(nativeIconView: NativeIconView)
nativeAdView.nativeMediaView = nativeMediaView: NativeMediaView

Привяжите объект NativeAd к NativeAdView.

nativeAdView.registerView(nativeAd: NativeAd)
// or nativeAdView.registerView(nativeAd: NativeAd, placementName: String) if you use placements
к сведению

Если к данному экземпляру NativeAdView уже было зарегистрировано другое объявление, его отслеживание будет автоматически прекращено.

Для остановки отслеживания NativeAd необходимо вызвать:

nativeAdView.unregisterViewForInteraction();
примечание

Если NativeAdView используется повторно для повторного показа объявления или для показа других рекламных объявлений через определенные промежутки времени, необходимо вызвать метод unregisterViewForInteraction(), прежде чем зарегистрировать это же представление с помощью другого экземпляра NativeAd.

Для удаления NativeAd, привязанного к NativeAdView, необходимо вызвать:

nativeAdView.destroy()
примечание

Невозможно использовать NativeAdView после вызова destroy(). Необходимо либо скрыть NativeAdView, либо привязать новое объявление.

Пример Интеграции

fun loadNativeAds() {
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ICON)
Appodeal.initialize(this, YOUR_APP_KEY, Appodeal.NATIVE, consentValue)
Appodeal.setNativeCallbacks(new NativeCallbacks() {
override fun onNativeLoaded() {
Toast.makeText(MainActivity.this, "onNativeLoaded", Toast.LENGTH_SHORT).show()
}

override fun onNativeFailedToLoad() {
Toast.makeText(MainActivity.this, "onNativeFailedToLoad", Toast.LENGTH_SHORT).show()
}

override fun onNativeShown(NativeAd nativeAd) {
Toast.makeText(MainActivity.this, "onNativeShown", Toast.LENGTH_SHORT).show()
}

override fun onNativeClicked(NativeAd nativeAd) {
Toast.makeText(MainActivity.this, "onNativeClicked", Toast.LENGTH_SHORT).show()
}

override fun onNativeExpired() {
Toast.makeText(MainActivity.this, "onNativeExpired", Toast.LENGTH_SHORT).show()
}
})
}

После получение метода обратного вызова onNativeLoaded, можно получить нативную рекламу при помощи Appodeal.getNativeAds() и показать её, как указано в пункте "Использование собственной разметки".

Для отображения загруженной нативной рекламы используйте:

fun showNativeAd() {
val loadedNativeAds = Appodeal.getNativeAds(1)
if (loadedNativeAds.isEmpty()) {
//Native Ads not loaded yet
return
}
val nativeAd = loadedNativeAds[0]
val nativeAdView: NativeAdView = findViewById(R.id.native_layout)
val tvTitle: TextView = nativeAdView.findViewById(R.id.tv_title)
tvTitle.text = nativeAd.title
nativeAdView.titleView = tvTitle
val tvDescription: TextView = nativeAdView.findViewById(R.id.tv_description)
tvDescription.text = nativeAd.description
nativeAdView.descriptionView = tvDescription
val ratingBar: RatingBar = nativeAdView.findViewById(R.id.rb_rating)
if (nativeAd.rating == 0f) {
ratingBar.visibility = View.INVISIBLE
} else {
ratingBar.visibility = View.VISIBLE
ratingBar.rating = nativeAd.rating
ratingBar.stepSize = 0.1f
}
nativeAdView.ratingView = ratingBar
val ctaButton: Button = nativeAdView.findViewById(R.id.b_cta)
ctaButton.text = nativeAd.callToAction
nativeAdView.callToActionView = ctaButton
val providerView = nativeAd.getProviderView(context)
if (providerView != null) {
if (providerView.parent != null && providerView.parent is ViewGroup) {
(providerView.parent as ViewGroup).removeView(providerView)
}
val providerViewContainer: FrameLayout = nativeAdView.findViewById(R.id.provider_view)
val layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
providerViewContainer.addView(providerView, layoutParams)
}
nativeAdView.providerView = providerView
val tvAgeRestrictions: TextView = nativeAdView.findViewById(R.id.tv_age_restriction)
if (nativeAd.ageRestrictions != null) {
tvAgeRestrictions.text = nativeAd.ageRestrictions
tvAgeRestrictions.visibility = View.VISIBLE
} else {
tvAgeRestrictions.visibility = View.GONE
}
val nativeIconView: NativeIconView = nativeAdView.findViewById(R.id.icon)
nativeAdView.setNativeIconView(nativeIconView)
val nativeMediaView: NativeMediaView =
nativeAdView.findViewById(R.id.appodeal_media_view_content)
nativeAdView.nativeMediaView = nativeMediaView
nativeAdView.registerView(nativeAd)
nativeAdView.visibility = View.VISIBLE
}

Пример Интеграции Нативной Рекламы В Ленту​

Для интеграции нативной рекламы в ленту вашего приложения можете воспользоваться данным примером:

import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout
import android.widget.RatingBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.appodeal.ads.*

/**
* Wrapper adapter to show Native Ad in recycler view with fixed step
*
* @param userAdapter user adapter
* @param nativeStep step show [com.appodeal.ads.NativeAd]
*/
class AppodealWrapperAdapter(
userAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>,
nativeStep: Int
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), NativeCallbacks {

private val _userAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>?
private val userAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>
get() = requireNotNull(_userAdapter)
private var nativeStep = DEFAULT_NATIVE_STEP
private val nativeAdList = SparseArray<NativeAd?>()

init {
this._userAdapter = userAdapter
this.nativeStep = nativeStep + 1
userAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
notifyDataSetChanged()
fillListWithAd()
}

override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
super.onItemRangeInserted(positionStart, itemCount)
notifyDataSetChanged()
fillListWithAd()
}
})
Appodeal.setNativeCallbacks(this)
fillListWithAd()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == VIEW_HOLDER_NATIVE_AD_TYPE) {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.include_native_ads, parent, false)
NativeCustomAdViewHolder(view)
} else {
userAdapter.onCreateViewHolder(parent, viewType)
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is NativeCustomAdViewHolder) {
holder.fillNative(nativeAdList[position])
} else {
userAdapter.onBindViewHolder(holder, getPositionInUserAdapter(position))
}
}

override fun getItemCount(): Int {
var resultCount = 0
resultCount += nativeAdsCount
resultCount += userAdapterItemCount
return resultCount
}

override fun getItemViewType(position: Int): Int {
return if (isNativeAdPosition(position)) {
VIEW_HOLDER_NATIVE_AD_TYPE
} else {
userAdapter.getItemViewType(getPositionInUserAdapter(position))
}
}

override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
super.onViewRecycled(holder)
if (holder is NativeCustomAdViewHolder) {
holder.unregisterViewForInteraction()
}
}

/**
* Destroy all used native ads
*/
fun destroyNativeAds() {
for (i in 0 until nativeAdList.size()) {
val nativeAd = nativeAdList.valueAt(i)
nativeAd!!.destroy()
}
nativeAdList.clear()
}

override fun onNativeLoaded() {
fillListWithAd()
}

override fun onNativeFailedToLoad() {}
override fun onNativeShown(nativeAd: NativeAd?) {}
override fun onNativeShowFailed(nativeAd: NativeAd?) {}
override fun onNativeClicked(nativeAd: NativeAd?) {}
override fun onNativeExpired() {}

/**
* @return count of loaded ads [com.appodeal.ads.NativeAd]
*/
private val nativeAdsCount: Int
get() = nativeAdList.size()

/**
* @return user items count
*/
private val userAdapterItemCount: Int
get() = userAdapter.itemCount

/**
* @param position index in wrapper adapter
* @return `true` if item by position is [com.appodeal.ads.NativeAd]
*/
private fun isNativeAdPosition(position: Int): Boolean {
return nativeAdList[position] != null
}

/**
* Method for searching position in user adapter
*
* @param position index in wrapper adapter
* @return index in user adapter
*/
private fun getPositionInUserAdapter(position: Int): Int {
return position - nativeAdList.size().coerceAtMost(position / nativeStep)
}

/**
* Method for filling list with [com.appodeal.ads.NativeAd]
*/
private fun fillListWithAd() {
var insertPosition = findNextAdPosition()
var nativeAd: NativeAd? = null
while (canUseThisPosition(insertPosition) && nativeAdItem.also { nativeAd = it } != null) {
nativeAdList.put(insertPosition, nativeAd)
notifyItemInserted(insertPosition)
insertPosition = findNextAdPosition()
}
}

/**
* Get native ad item
*
* @return [com.appodeal.ads.NativeAd]
*/
private val nativeAdItem: NativeAd?
get() {
val ads = Appodeal.getNativeAds(1)
return if (ads.isNotEmpty()) ads[0] else null
}

/**
* Method for finding next position suitable for [com.appodeal.ads.NativeAd]
*
* @return position for next native ad view
*/
private fun findNextAdPosition(): Int {
return if (nativeAdList.size() > 0) {
nativeAdList.keyAt(nativeAdList.size() - 1) + nativeStep
} else nativeStep - 1
}

/**
* @param position index in wrapper adapter
* @return `true` if you can add [com.appodeal.ads.NativeAd] to this position
*/
private fun canUseThisPosition(position: Int): Boolean {
return nativeAdList[position] == null && itemCount > position
}

/**
* View holder for create custom [com.appodeal.ads.native_ad.views.NativeAdView]
*/
internal class NativeCustomAdViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

private val nativeAdView: NativeAdView = itemView.findViewById(R.id.native_item)
private val tvTitle: TextView = itemView.findViewById(R.id.tv_title)
private val tvDescription: TextView = itemView.findViewById(R.id.tv_description)
private val ratingBar: RatingBar = itemView.findViewById(R.id.rb_rating)
private val ctaButton: Button = itemView.findViewById(R.id.b_cta)
private val nativeIconView: NativeIconView = itemView.findViewById(R.id.icon)
private val tvAgeRestrictions: TextView = itemView.findViewById(R.id.tv_age_restriction)
private val nativeMediaView: NativeMediaView = itemView.findViewById(R.id.appodeal_media_view_content)
private val providerViewContainer: FrameLayout = itemView.findViewById(R.id.provider_view)

fun fillNative(nativeAd: NativeAd?) {
tvTitle.text = nativeAd!!.title
tvDescription.text = nativeAd.description
if (nativeAd.rating == 0f) {
ratingBar.visibility = View.INVISIBLE
} else {
ratingBar.visibility = View.VISIBLE
ratingBar.rating = nativeAd.rating
ratingBar.stepSize = 0.1f
}
ctaButton.text = nativeAd.callToAction
val providerView = nativeAd.getProviderView(nativeAdView.context)
if (providerView != null) {
if (providerView.parent != null && providerView.parent is ViewGroup) {
(providerView.parent as ViewGroup).removeView(providerView)
}
providerViewContainer.removeAllViews()
val layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
providerViewContainer.addView(providerView, layoutParams)
}
if (nativeAd.ageRestrictions != null) {
tvAgeRestrictions.text = nativeAd.ageRestrictions
tvAgeRestrictions.visibility = View.VISIBLE
} else {
tvAgeRestrictions.visibility = View.GONE
}
if (nativeAd.containsVideo()) {
nativeAdView.nativeMediaView = nativeMediaView
} else {
nativeMediaView.visibility = View.GONE
}
nativeAdView.titleView = tvTitle
nativeAdView.descriptionView = tvDescription
nativeAdView.ratingView = ratingBar
nativeAdView.callToActionView = ctaButton
nativeAdView.setNativeIconView(nativeIconView)
nativeAdView.providerView = providerView
nativeAdView.registerView(nativeAd)
nativeAdView.visibility = View.VISIBLE
}

fun unregisterViewForInteraction() {
nativeAdView.unregisterViewForInteraction()
}
}

companion object {
private const val DEFAULT_NATIVE_STEP = 5
private const val VIEW_HOLDER_NATIVE_AD_TYPE = 600
}
}

Для использования данного адаптера-обертки над уже существующим в вашем приложении адаптером создайте экземпляр AppodealWrapperAdapter:

val appodealWrapperAdapter: AppodealWrapperAdapter = AppodealWrapperAdapter(myAdapter, 2)

Передайте этот адаптер в recycler view.

Распространенные Ошибки​

  • Нет атрибута объявления или иконки AdChoices

Большинство рекламных сетей требуют от издателя добавления специальной метки для нативного объявления, чтобы пользователи не принимали рекламу за контент. Проверьте, что для нативных объявлениях в вашем приложении указаны соответствующие атрибуты рекламы (например, «Ad») или иконка AdChoices.

  • Отсутствие обязательных элементов объявлений

Каждое нативное объявление должно содержать:

  • заголовок;

  • кнопку для действия;

  • иконку атрибута рекламы или иконку AdChoices;

  • изображение, видео или иконку.

  • Изменение элементов нативных объявлений

Рекламодатели ожидают, что их реклама будет отображаться четко и без каких-либо изменений. Вы можете изменять масштаб кнопки и изображений, но не обрезать, перекрывать или искажать их.

  • Наложение элементов нативных объявлений друг на другаr

Убедитесь, что все элементы нативного объявления видны и не перекрывают друг друга.

к сведению

Требования к нативной рекламе:

  • Все поля нативного объявления, помеченные как обязательные, должны отображаться.
  • Каждое объявление должно иметь знак, четко указывающий, что это рекламное объявление. Например "Ad" или "Sponsored".
  • Предоставляемые изображения можно масштабировать, чтобы соответствовать вашему рекламному месту, но нельзя значительно искажать или обрезать.

Проверка Инициализизации

Чтобы проверить, была ли проинициализирована ли нативная реклама, вы можете использовать метод:

Appodeal.isInitialized(Appodeal.NATIVE)

Возвращает true, если нативная реклама была проинициализирована.

Проверка Типа Кеширования

Чтобы проверить, включено ли автоматическое кеширование для нативной рекламы, вы можете использовать метод:

Appodeal.isAutoCacheEnabled(Appodeal.NATIVE)

Возвращает true, если автоматическое кеширование включено для нативной рекламы.

Получение Прогнозируемого eCPM

Для того, чтобы получить прогнозируемый eCPM для нативной рекламы для следующего блока в очереди на опрос, вы можете использовать метод:

NativeAd.getPredictedEcpm()
подсказка

Этот метод целесообразно использовать, если включено ручное кэширование рекламы.

Проверка показа​

Вы всегда можете проверить в логах был ли засчитан показ и видна ли реклама.

Вы увидите Native [Notify Shown] лог если показ был успешно засчитан.

Appodeal  com.example.app  D Native [Notify Shown]