Реалізація In-App Messages в мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація In-App Messages в мобільному додатку
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація In-App Messages у мобільному додатку

In-App Messages — це не push. Вони показуються лише коли додаток відкритий, не вимагають дозволів, не йдуть у notification center. Модальне вікно при відкритті додатку, банер внизу екрану при потрібній дії, fullscreen оффер після першої покупки — це все IAM. Головна технічна задача: показувати їх у правильний момент, не дратуючи користувача.

Платформенні рішення vs власна реалізація

Два шляхи: використовувати SDK (OneSignal IAM, Firebase In-App Messaging, Braze, Intercom, Appcues) або реалізувати власний механізм. SDK — швидкий старт, але обмежена кастомізація UI. Власне рішення — повний контроль над зовнішнім виглядом та логікою показу.

Firebase In-App Messaging — бесплатно, інтегрується з Firebase Analytics events:

// iOS — автоматично показує IAM при логуванні зазначеної события
Analytics.logEvent("checkout_started", parameters: [
    "cart_value": 450.0
])
// У Firebase Console: тригер IAM = событие "checkout_started", умова cart_value > 200
// Android
FirebaseAnalytics.getInstance(context).logEvent("checkout_started") {
    param("cart_value", 450.0)
}

Firebase IAM показує повідомлення автоматично — додатку нічого додатково робити не потрібно. Обмеження: UI редагується лише через Firebase Console (шаблони), немає повного контролю над анімаціями та стилями.

Власна реалізація: архітектура

Для повного контролю реалізуємо власний IAM-рушій. Компоненти:

  1. Campaign Manager — отримує список активних кампаній з бекенду (або Remote Config).
  2. Trigger Engine — відстежує события додатку, зіставляє з умовами кампаній.
  3. Display Controller — керує чергою показу, anti-spam правилами.
  4. UI Layer — рендерить конкретний тип повідомлення.
// Android — Display Controller
class InAppMessageController(
    private val campaignRepo: CampaignRepository,
    private val displayHistory: DisplayHistoryDao
) {
    suspend fun onEvent(eventName: String, params: Map<String, Any> = emptyMap()) {
        val campaigns = campaignRepo.getActiveCampaigns()
        val eligible = campaigns.filter { campaign ->
            campaign.trigger.eventName == eventName &&
            matchesConditions(campaign, params) &&
            !wasShownRecently(campaign.id)
        }

        // Показуємо лише одне повідомлення за раз — пріоритет за score
        eligible.maxByOrNull { it.priority }?.let { campaign ->
            displayHistory.record(campaign.id, System.currentTimeMillis())
            showMessage(campaign)
        }
    }

    private suspend fun wasShownRecently(campaignId: String): Boolean {
        val lastShown = displayHistory.getLastShownTime(campaignId) ?: return false
        val cooldownMs = 24 * 60 * 60 * 1000L // 24 години
        return System.currentTimeMillis() - lastShown < cooldownMs
    }
}

Типи UI та як їх показувати

Modal (центральний попап). На iOS — через UIViewController з modalPresentationStyle = .overCurrentContext та прозорим фоном:

let iamVC = InAppMessageViewController(campaign: campaign)
iamVC.modalPresentationStyle = .overCurrentContext
iamVC.modalTransitionStyle = .crossDissolve
topViewController?.present(iamVC, animated: true)

Пошук topViewController при складній навігації (TabBar + NavigationController + модалки) — окрема задача. Рекурсивний хелпер через presentedViewController та children.

Bottom Sheet / Banner. На Android — BottomSheetDialogFragment або кастомний View, додається через WindowManager поверх поточного контенту. Другий варіант працює навіть у фрагментах без необхідності знати поточний екран, але вимагає дозволу SYSTEM_ALERT_WINDOW — небажано.

Краще — BottomSheet через supportFragmentManager:

class InAppBottomSheet : BottomSheetDialogFragment() {
    // ... біндинг даних кампанії
    override fun onCreateView(...) = InAppBottomSheetBinding.inflate(inflater).also {
        binding = it
    }.root
}

InAppBottomSheet.newInstance(campaign).show(supportFragmentManager, "iam_bottom_sheet")

Fullscreen. Окремий Activity з FLAG_FULLSCREEN — найнадійніше на Android. На iOS — UIViewController з modalPresentationStyle = .fullScreen.

Таргетинг та умови показу

Тип умови Приклад
Событие-тригер screen_viewed = "home", purchase_completed
Кількість сессій session_count >= 3
Атрибут користувача subscription = "free", days_since_install >= 7
Часове вікно лише з 10:00 до 22:00
Частотний кап не частіше 1 раза на 48 годин

Без частотного капу IAM перетворюється на дратівник. Зберігайте час останнього показу кожної кампанії — у Room (Android) або Core Data / UserDefaults (iOS, якщо даних мало).

Аналітика

Мінімальний набір подій для аналітики IAM:

  • iam_displayed — повідомлення показано
  • iam_dismissed — закрито без дії
  • iam_action_clicked — натиснута кнопка дії (з action_id)
  • iam_converted — цільова событие після показу (покупка, реєстрація)
Analytics.logEvent("iam_action_clicked", parameters: [
    "campaign_id": campaign.id,
    "action_id": "upgrade_now",
    "screen": currentScreenName
])

Терміни

Інтеграція Firebase IAM з тригерами по событіям — 2–3 дні. Власний IAM-рушій з Campaign Manager, Trigger Engine, трьома типами UI (modal, banner, fullscreen), аналітикою та частотними капами — 10–15 робочих днів.