Реализация баннерной рекламы в мобильном приложении
Баннер — самый простой формат по интеграции, но с наибольшим количеством UX-ошибок в продакшне. Типичная картина: баннер прыгает при загрузке и сдвигает контент, размер фиксированный 320×50 (который Google уже считает устаревшим), а на планшете — крошечная полоска посередине широкого экрана. Всё это решается правильным выбором размера и управлением layout на этапе интеграции, а не после ревью.
Адаптивный баннер вместо фиксированного
Google AdMob с версии 19.x рекомендует adaptive banner вместо BANNER (320×50) и LEADERBOARD (728×90). Адаптивный баннер получает ширину контейнера и сам выбирает оптимальную высоту:
// Android
val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adContainerWidth)
adView.setAdSize(adSize)
// iOS
let viewWidth = view.frame.inset(by: view.safeAreaInsets).width
let adaptiveSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSize(forWidth: viewWidth)
bannerView.adSize = adaptiveSize
Высота адаптивного баннера — от 50 до 90 dp в зависимости от ширины. Это важно для layout: нельзя захардкодить layout_height="50dp" — баннер либо обрежется, либо оставит пустое место. Правильный подход — слушать onAdLoaded и устанавливать высоту программно через adView.adSize.getHeightInPixels(context).
Проблема прыжка контента
Самая раздражающая ошибка баннерной рекламы — когда при загрузке баннера контент экрана смещается вниз. Google за это понижает рейтинг в магазине. Решение: резервировать место для баннера до его загрузки.
На Android: контейнер FrameLayout с фиксированной высотой wrap_content и начальным visibility="invisible". После onAdLoaded — View.VISIBLE. Контент не прыгает, место уже зарезервировано.
На iOS с автолейаутом: добавляем NSLayoutConstraint для высоты баннера с начальным значением 0, обновляем constraint после загрузки через UIView.animate.
Sticky-баннер внизу экрана
Наиболее популярное размещение — закреплённый баннер над tab bar или navigation bar. Нюанс: на iPhone с Dynamic Island или notch нужно учитывать safeAreaInsets.bottom. Баннер, перекрывающий home indicator, Apple отклоняет при ревью — видели несколько таких кейсов.
bannerView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
bannerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
bannerView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
Обновление и жизненный цикл
Баннер нужно останавливать при уходе приложения в фон (onPause / applicationWillResignActive) и возобновлять при возврате. Без этого возможен IllegalStateException на Android при попытке загрузить новое объявление в неактивной Activity.
Автообновление (по умолчанию 60 сек в AdMob) можно настроить в консоли, но не через SDK — это ограничение намеренное. Если нужна другая частота — используйте AdView.pause() / resume() в сочетании с ручным таймером.
Сроки интеграции баннерной рекламы — 1–2 дня с учётом тестирования на разных устройствах и размерах экрана.







