Інтеграція рекламної мережі Яндекс.Реклами у мобільний додаток
Яндекс Мобільні Рекламні Блоки (YandexMobileAds SDK) — один з небагатьох джерел рекламного доходу, який стабільно працює для російськомовної аудиторії після 2022 року. Коефіцієнт заповнення у Яндекса в Росії вищий, ніж у AdMob для того ж трафіку, особливо в категоріях утилітарних програм, новин та ігор.
Підводні каміння SDK
SDK Яндекса версії 7.x переробив ініціалізацію: тепер потрібен явний MobileAds.initialize(context) у Application.onCreate(), а не ленива ініціалізація при першому запиті. Старий паттерн працює, але перші 2–3 запити до сервера проходять з затримкою ~800 мс — видно на метриці time-to-first-ad.
На iOS подібна історія: YMAMobileAds.initializeSdk() потрібно вироблювати у applicationDidFinishLaunching, до будь-яких UI-операцій. Якщо ініціалізація відбувається пізніше (наприклад, всередину lazy var), перші банери не показуються на холодному запуску — і це не фіксується в Crashlytics, просто тиха помилка.
Нативна реклама (YMANativeAd) вимагає обов'язкового вказання adContainer та виклику bind(with:) до показу. Якщо біндинг не пройшов — YMANativeAdViewProtocol не рендериться, місце залишається порожнім. Це типова помилка при використанні нативки у UITableViewCell: при переиспользовании ячейки потрібно явно відв'язувати попередній nativeAd через unbind().
Як ми підключаємо
Android залежності:
implementation 'com.yandex.android:mobileads:7.5.0'
// Якщо потрібна медіація через AdMob
implementation 'com.yandex.ads.adapters:admob:7.5.0.0'
iOS (CocoaPods / SPM):
pod 'YandexMobileAds', '~> 7.5'
Для Android важливо додати в AndroidManifest.xml мета-тег з ідентифікатором партнера — без нього оголошення не завантажуються в production, лише тестові. Часта помилка: розробник тестує на тест-ID, всё працює, а в релізі — нуль показів.
Формати та специфіка реалізації
Sticky-банер (YMAAdSize.stickySize(withContainerWidth:)) — адаптивний формат, який автоматично підбирає висоту під ширину контейнера. Не використовуйте фіксований 320×50 — Яндекс його підтримує, але коефіцієнт заповнення адаптивного банера вищий приблизно на 15–20% за нашими спостереженнями.
Rewarded відрізняється від інших мереж тим, що подія rewardDidLoad спрацьовує до показу, а сама нагорода передається у didReward(_ reward:). Якщо логіка видачі награди прив'язана до dismiss-события — отримаєте ситуацію, коли користувач закрив рекламу до кінця, але нагорода вже почислена.
Інтерстиціал — окремий інстанс YMAInterstitialAd на кожен показ. Переиспользование одного об'єкту для кількох показів підряд — undefined behavior, який ломається на iOS 16+ з EXC_BAD_ACCESS при повторному виклику show().
Етапи інтеграції
- Створення рекламного блоку в Яндекс Партнерському інтерфейсі, отримання
blockID - Додавання SDK та налаштування ініціалізації в Application/AppDelegate
- Реалізація форматів з правильними lifecycle-хуками
- GDPR/згода —
YMAUserConsentдля EU-користувачів - Тестування з demo-blockID (
R-M-DEMO-*), потім з реальними блоками - Моніторинг коефіцієнту заповнення та RPM в Яндекс Партнерському кабінету
Графіки роботи: одиночний формат — 1 день, повна інтеграція всіх форматів з правильними lifecycle-хуками — 2–3 дні. Стоимість рассчитывается після обговорення обсягу робіт.







