Розробка мобільного додатку для фан-клубу
Фан-клубний додаток — це не просто стрічка новин з логотипом улюбленої команди. Аудиторія у таких продуктів специфічна: фанати реагують емоційно, чекають контент одразу після матчу або виступу, та йдуть якщо додаток тормозить у найважливіший момент — фінальний свисток, концерт, анонс альбому.
Чим відрізняється від звичайного додатку новин
Три функції роблять фан-клубний продукт нетривіальним з технічної точки зору.
Екслюзивний контент з доступом по підписці. Частина матеріалів доступна тільки платним учасникам. На iOS — StoreKit 2 для управління підписками. Product.SubscriptionInfo.RenewalInfo дає актуальний статус прямо від Apple без звернення до сервера. Серверна валідація все одно потрібна — AppStore.verifyTransaction() перевіряє JWSTransaction. Без серверної валідації — ризик підробки локального стану.
На Android — Google Play Billing Library 6+. BillingClient.queryPurchasesAsync(QueryPurchasesParams) для отримання активних підписок при кожному запуску. Автоматичне продовження Google обробляє самостійно, але SUBSCRIPTION_ON_HOLD та SUBSCRIPTION_PAUSED потрібно обробити явно — інакше користувач з приостановленою підпискою видить платний контент.
Push-сповіщення в реальному часі. Гол забили — сповіщення приходить за 5 секунд. Затримка на 30 секунд руйнує цінність. Firebase Cloud Messaging для доставки, але сама подія повинна ініціюватись сервером негайно — через вебхук від джерела даних (наприклад, API спортивної ліги) або через WebSocket якщо є live-дані.
Персоналізація сповіщень: підписка на конкретного гравця, на конкретний турнір. На клієнті — notification topic subscriptions у FCM. На сервері — сегментація аудиторії через теги.
Live-трансляція подій. Текстова трансляція матчу через WebSocket — кожна подія (гол, жовта карточка, заміна) приходить в реальному часі. На клієнті: URLSessionWebSocketTask (iOS) або OkHttp WebSocket (Android), оновлюємо @Observable (iOS) або StateFlow (Android) без перезавантаження списків.
Галерея та медіаконтент
Фотогалерея з подій — UICollectionView з compositional layout та pinch-to-zoom через координатор навігації. Відеоролики — AVPlayer з HLS (m3u8) для адаптивної якості. Не MP4 прямою посиланням — HLS дозволяє підібрати якість під швидкість соединення без переключення вручну.
Завантаження важких фото з CDN — Kingfisher з DownsamplingImageProcessor для thumbnail у стрічці, оригінал завантажується при відкритті на повний екран.
Голосування та інтерактив
Опитування — стандартний CRUD на сервері, на клієнті достатньо URLSession + Codable. Але анімація результатів голосування (плавне заповнення progress-бара) потребує обережної роботи з UIView.animate або Compose animateFloatAsState.
Мерч-магазин — інтеграція через WebView (WKWebView) з існуючим інтернет-магазином, або нативний список через REST API магазину. Нативний варіант дає кращий UX, WebView — швидше в реалізації.
Стек та архітектура
iOS: Swift, SwiftUI + UIKit для складних екранів, MVVM з @Observable, Combine для реактивних потоків, StoreKit 2, URLSessionWebSocketTask, Kingfisher, AVKit.
Android: Kotlin, Jetpack Compose, ViewModel + StateFlow, Google Play Billing Library 6, OkHttp WebSocket, Coil, ExoPlayer.
Flutter як крос-платформа: Riverpod для стану, in_app_purchase для підписок (обгортка над StoreKit та Play Billing), web_socket_channel, cached_network_image, chewie для відео.
Процес та терміни
Аудит вимог → архітектура даних (контент, підписки, користувачі) → UI kit → core функції (стрічка, профіль, push) → екслюзивний контент + підписки → інтерактив → тестування → публікація.
Базовий додаток (стрічка, профіль, push-сповіщення, галерея) — 4–8 тижнів. З підписками, live-трансляцією та мерч-магазином — 2–3 місяці. Вартість розраховується після детального аналізу вимог.







