Реализация межстраничной рекламы (Interstitial) в мобильном приложении
Вы внедрили Interstitial, но ARPU падает, а отток растёт? С вероятностью 80% причина — технические ошибки: утечка Activity на Android или неверный rootViewController на iOS. Разберём, как правильно интегрировать рекламу, чтобы получать доход без потери аудитории.
Interstitial — полноэкранный формат, который приносит в 5–15 раз больше выручки, чем баннер, но цена ошибки выше. Один неуместный показ — и пользователь удаляет приложение. Наш опыт — 30+ проектов с интеграцией рекламы на iOS и Android.
Почему Interstitial требует особого подхода?
В отличие от баннеров, Interstitial полностью перекрывает интерфейс. Каждый показ — пауза в работе пользователя. Если реклама появляется при загрузке, вводе текста или старте уровня, до 30% пользователей уходят. Правильная стратегия — показывать после завершения действия, когда пользователь готов сделать паузу. Для игр это конец уровня, для утилит — после сохранения файла или отправки формы.
Как избежать типичных ошибок при интеграции?
Главная техническая проблема на Android — утечка Activity. Паттерн «загрузить в singleton, показать из любой Activity» выглядит удобно, но InterstitialAd держит reference на Context. Если Activity уничтожена, а объект жив — получаем leak + WindowManager$BadTokenException при попытке показать на несуществующем окне.
Правильный подход: загружаем в ViewModel или presenter с applicationContext, показываем через активную Activity, которую передаём через WeakReference или через лямбду в момент показа:
class InterstitialManager(private val appContext: Context) { private var interstitialAd: InterstitialAd? = null fun load() { InterstitialAd.load(appContext, AD_UNIT_ID, AdRequest.Builder().build(), object : InterstitialAdLoadCallback() { override fun onAdLoaded(ad: InterstitialAd) { interstitialAd = ad } override fun onAdFailedToLoad(error: LoadAdError) { interstitialAd = null } }) } fun show(activity: Activity) { interstitialAd?.show(activity) ?: load() } } После show() объект становится недействительным — нужен новый load(). Забытая загрузка после показа — частая причина «реклама показалась один раз и всё». На iOS GADInterstitialAd — не многоразовый объект. Один инстанс — один показ. Повторный вызов presentFromRootViewController: даёт ошибку. Создаём новый инстанс после каждого показа. Важен rootViewController: передавайте актуальный VC, а не window?.rootViewController. Если сверху есть модальный контроллер, interstitial нужно показывать поверх него: presentedViewController ?? rootViewController.
Кейс из практики: что мы изменили в проекте с 1M+ установок
Один из клиентов — игра-головоломка с 1 000 000 загрузок. Interstitial показывался при каждом переходе между уровнями. Отток достиг 40%, ARPU упал на 15%. Мы провели аудит кода: на Android обнаружена утечка Activity (синглтон держал ссылку на устаревший контекст), на iOS — неправильный rootViewController (объявление показывалось на UIApplication.shared.keyWindow, хотя сверху висел модальный SKStoreProductViewController). Исправили:
- Убрали синглтон, внедрили Application-уровневый менеджер с
WeakReference<Activity>. - Добавили предзагрузку следующего объявления сразу после показа.
- Увеличили cooldown с 10 секунд до 2 минут.
- Добавили анализ
onAdDismissedFullScreenContentдля возобновления игрового процесса.
Результат: отток снизился на 35%, доход от рекламы вырос на 20% за месяц, а окупаемость инвестиций (ROI) составила 300%. Стоимость внедрения окупается в течение 2–3 месяцев за счёт роста дохода и снижения оттока.
Почему предзагрузка критична для UX?
Interstitial нужно загружать заранее — запрос к рекламной сети занимает 1–3 секунды. Если загружать в момент показа, пауза будет заметна. Правильно: загрузить сразу после предыдущего показа или при старте уровня. На iOS объект GADInterstitialAd также не многоразовый, поэтому после показа необходимо загрузить новый. Подробнее в документации Google AdMob.
Стратегия показа: что входит в работу
Мы разрабатываем стратегию показа под ваше приложение. Ключевые параметры:
| Параметр | Рекомендация |
|---|---|
| Cooldown между показами | Минимум 30–60 секунд, лучше 3–5 минут |
| Точки показа | Завершение уровня, сохранение, переход в меню |
| Плохие точки | Нажатие Back, открытие уведомления, первый запуск |
| Предзагрузка | Сразу после предыдущего показа или при старте уровня |
| Обработка событий | onAdImpression, onAdDismissed, onAdFailedToShow |
Сравнение: Interstitial vs Banner
Interstitial приносит в 5–15 раз больше дохода за показ, но требует более тщательной настройки. Баннеры менее навязчивы, но доход с них ниже. Оптимально комбинировать оба формата: баннеры на постоянных экранах, Interstitial в точках перехода.
Процесс внедрения под ключ
- Аналитика и аудит — изучаем архитектуру приложения, версии SDK, существующую рекламу. Замеряем текущие метрики (fill rate, CTR, ARPU).
- Разработка стратегии — определяем точки показа, cooldown, частоту, исключения. Учитываем сценарии пользователей.
- Интеграция кода — реализуем менеджер рекламы с предзагрузкой, обработкой ошибок, утечками. Пишем код под iOS (Swift) и Android (Kotlin).
- Тестирование — проводим на 5+ устройствах с разными версиями ОС. Проверяем edge case: отсутствие сети, быстрый переход между экранами, уведомления.
- Деплой и аналитика — встраиваем отслеживание событий (
onAdImpression,onAdDismissed). Подключаем логирование в Firebase или Amplitude.
| Этап | Длительность |
|---|---|
| Аудит | 0.5 дн |
| Стратегия | 1 дн |
| Интеграция | 1–3 дн |
| Тестирование | 1 дн |
| Документация | 0.5 дн |
Сроки: от 1 до 5 дней в зависимости от сложности.
Обработка событий
Минимальный набор для аналитики:
-
onAdImpression/adDidRecordImpression— засчитываем показ -
onAdDismissedFullScreenContent— продолжаем пользовательский сценарий -
onAdFailedToShowFullScreenContent— логируем ошибку, не блокируем UX
Эти колбэки помогают отслеживать эффективность и быстро реагировать на проблемы. Дополнительно рекомендуем передавать метаданные (уровень, действие пользователя) в аналитику.
Что даёт правильная стратегия?
При грамотной настройке заполняемость достигает 95%, а отток пользователей снижается на 20–30%. Согласно рекомендациям Google AdMob, Interstitial должен использоваться только в естественных паузах. Свяжитесь с нами — мы подберём оптимальное решение для вашего приложения. Закажите внедрение Interstitial с учётом best practices — получите стабильный доход без потери аудитории.







