Реалізація персоналізованого онбординга на основі анкети в мобільному додатку
Duolingo запитує «Чому ти вчиш мову?» та показує різний контент в залежності від відповіді. Headspace — «Що тебе турбує?» та пропонує відповідні медитації. Це не просто UX-паттерн — це механізм, який значно збільшує вероятність повернення користувача: додаток з перших секунд релевантний саме йому.
Архітектура анкети
Анкета персоналізації — це не просто набір екранів з кнопками «Далі». Це потік з розгалуженням: відповідь на питання 2 може визначати, який буде третій квітень. І результат — не просто збережені відповіді, а набір параметрів, які впливають на початковий стан додатку.
Data-driven конфігурація. Кожне питання — об'єкт з метаданими:
struct OnboardingQuestion {
let id: String
let type: QuestionType // .singleChoice, .multiChoice, .slider, .text
let title: String
let subtitle: String?
let options: [QuestionOption]
let nextQuestionId: [String: String] // optionId -> nextQuestionId, або "default"
let analyticsKey: String
}
Логіка розгалуження через словник nextQuestionId: якщо користувач вибрав «Снідження стресу» — наступне питання q_stress_level, якщо «Кращий сон» — q_sleep_problems. «default» — для питань без розгалуження. Конфігурація завантажується з сервера або бундлиться у додатку як JSON-файл.
QuestionnaireCoordinator управляє стеком питань: history: [String] для підтримки кнопки «Назад», currentQuestionId: String, answers: [String: Any] для накопування відповідей. При натисненні «Назад» — history.popLast() та повернення до попереднього питання зі збереженою відповіддю.
UI анкети
Навігація між питаннями
Перехід між екранами питань — горизонтальна анімація. На iOS: UIPageViewController у .scroll стилі або UIView.transition(with:duration:options:animations:) з .transitionCurlUp для незвичного відчуття. У SwiftUI — TabView з tabViewStyle(.page) при фіксованому selection не дає автоматичного свайпу назад — контролюємо через interactiveDismissDisabled.
Найкращий варіант — кастомна анімація через withAnimation(.spring(response: 0.4, dampingFraction: 0.8)) з offset та opacity. Дає повний контроль: вперед — слайд вліво, назад — слайд вправо.
Типи питань
Single choice — список карточок або пунктів, тап одразу переходить до наступного питання (без «Далі»). Haptic .selection при виборі. Вибрана карточка — анімоване змінення background та border.
Multi choice — чекбокси або карточки з множинним виділенням. Кнопка «Далі» появляється після вибору хоча б одного варіанта. LazyVGrid / FlowLayout для карточок з тегами.
Slider — UISlider / Slider у SwiftUI для числових значень (вік, частота, рівень). Лейбли по краях для контексту. Haptic .selection при кратних значеннях.
Progress indicator
Прогресс-бар показує позицію у анкеті. Анімований LinearProgressView / LinearProgressIndicator. Не показуємо точний крок («3 з 7») — користувач видит кінець та може кинути. Показуємо лише bar без числових позначок.
Персоналізація результата
Після завершення анкети зібраємо UserProfile з відповідей:
struct UserProfile {
let primaryGoal: Goal // з питання q_goal
let experienceLevel: Level // з питання q_experience
let preferredTopics: [Topic] // з питання q_topics (multi)
let availableTime: Int // хвилин на день з питання q_time
}
Цей профіль визначає: який контент показується на головному екрані, які push-уведомлення відправляються, які розділи приховані/показані, з яким рівнем складності починає користувач. Профіль зберігається локально (UserDefaults / DataStore) та синхронізується з сервером — при переінсталяції або зміні пристрою користувач не проходить анкету заново.
Пропуск анкети та редагування
Кнопка «Пропустити» — завжди. Не всі хочуть розповідати про себе. Пропустившим показуємо дефолтний контент та періодично (через 3–7 днів) ненавязливо пропонуємо заповнити «для кращих рекомендацій».
Можливість змінити відповіді пізніше — у налаштуваннях профілю. Не запирати користувача у першоначальному виборі. OnboardingQuestionnaireView переиспользуется у settings з режимом edit — ті ж компоненти, але з pre-filled відповідями та іншим completion-action (оновлення профілю замість переходу на головний екран).
Аналітика. Firebase Analytics: questionnaire_started, questionnaire_step_completed (з step_id та time_spent), questionnaire_skipped (з at_step), questionnaire_completed. За цими даними видно — на якому питанні користувачі уходять, які відповіді найпопулярніші, як впливає анкета на retention.
Терміни: 2–3 дні. Лінійна анкета з 5–7 питань з простим вибороміх та застосуванням результату до початкового контенту — 2 дні. Анкета з розгалуженням, server-driven конфігурацією, кількома типами питань, аналітикою та редагуванням у профілі — 3 дні.







