Реалізація нативної реклами у мобільному додатку
Нативна реклама — це не «реклама, яка виглядає не як реклама». Google та Apple вимагають явної маркування («Реклама», «Ad», «Sponsored»), і порушення цього правила ведить до відхилення додатку. Нативна реклама — це оголошення, яке візуально вписується в дизайн, але чесно ідентифікує себе. CTR грамотно реалізованої нативки в ленті — в 2–4 рази вищий за банер.
Де найчастіше ломається реалізація
Неправильний registerView.
AdMob вимагає реєстрації всіх кликабельних елементів у NativeAdView. Якщо не вислати nativeAdView.mediaView = ... та не передати всі view-компоненти, клики не будуть трекатися:
val nativeAdView = inflater.inflate(R.layout.native_ad_layout, null) as NativeAdView
nativeAdView.mediaView = nativeAdView.findViewById(R.id.ad_media)
nativeAdView.headlineView = nativeAdView.findViewById(R.id.ad_headline)
nativeAdView.bodyView = nativeAdView.findViewById(R.id.ad_body)
nativeAdView.callToActionView = nativeAdView.findViewById(R.id.ad_call_to_action)
nativeAdView.iconView = nativeAdView.findViewById(R.id.ad_icon)
// Після назначення всіх view — біндимо оголошення
nativeAdView.setNativeAd(nativeAd)
Забутий nativeAdView.setNativeAd(nativeAd) в кінці — оголошення не показується вообще. Це не помилка в logcat, просто порожний layout.
Переиспользование у RecyclerView.
При прокручуванні ячейки з нативною рекламою переиспользуються. Якщо не вислати previousNativeAd.destroy() перед привязкою нового оголошення — старий NativeAd продовжує тримати ресурси. На довгих лентах з нативною рекламою кожні 5–10 позицій це виражається у зростанні пам'яті ~15–20 MB за сесію.
override fun onViewRecycled(holder: NativeAdViewHolder) {
holder.nativeAdView.setNativeAd(null) // откепляет попередній NativeAd
// або зберігаємо reference та вираховуємо nativeAd.destroy()
}
На iOS аналогічна проблема: GADNativeAd потрібно явно обнулювати у prepareForReuse() ячейки.
Шаблони vs користувальницький дизайн
AdMob пропонує GADNativeAdView (iOS) та NativeAdView (Android) як контейнери з готовою логікою трекинга кліків. Верстати всередину цих контейнерів обов'язково — не можна просто накласти свої views зверху та очікувати, що клики будуть рахуватися.
Дизайн шаблону — вільний у межах гайдлайнів платформи. Обмеження: логотип/іконка рекламодавця повинні бути видні, маркування «Ad» обов'язково, CTA-кнопка повинна бути кликабельна (не просто текст).
Google забороняє нативну рекламу, яка візуально невідрізна від редакційного контенту — тобто без маркування. За це дають страйк та видаляють додаток з AdMob.
Завантаження та кешування
Нативні оголошення завантажуються через AdLoader з forNativeAd(). Можна запросити до 5 оголошень за раз через withNativeAdOptions(NativeAdOptions.Builder().setRequestMultipleImages(true).build()) — це корисно для ленти, де нативка вставляється на різних позиціях.
Кешувати оголошення довше 1 години не має сенсу — AdMob аннулює їх зі сторони сервера.
val adLoader = AdLoader.Builder(context, AD_UNIT_ID)
.forNativeAd { nativeAd ->
nativeAdsList.add(nativeAd)
if (!adLoader.isLoading && nativeAdsList.size == requestCount) {
insertAdsIntoList()
}
}
.withAdListener(object : AdListener() {
override fun onAdFailedToLoad(error: LoadAdError) {
// логуємо, не показуємо користувачу
}
})
.build()
adLoader.loadAds(AdRequest.Builder().build(), requestCount)
Графіки реалізації нативної реклами: шаблон в одному місці — 1–2 дні, користувальницький дизайн з інтеграцією в ленту/RecyclerView — 2–3 дні. Стоимость рассчитывается після обговорення дизайну та кількості точок розміщення.







