Разработка мобильного приложения для ставок на спорт
Букмекерское приложение — это real-time система с тысячами одновременно обновляемых котировок, строгими требованиями к геолокационному контролю и сложной инфраструктурой платежей. Задержка обновления коэффициентов в 3–5 секунд — пользователи ставят по устаревшим данным, оператор несёт убытки из-за арбитражников. Центральная техническая задача — актуальность данных.
Real-time котировки: не polling, а push
WebSocket — единственный разумный подход для live-котировок. REST polling каждые 3 секунды при 500 открытых матчах создаёт неприемлемую нагрузку и всё равно не даёт real-time. Схема: одно WebSocket-соединение, подписки на события (SUBSCRIBE {market_ids: [...]}), сервер присылает дифф ({market_id: 123, outcomes: [{id: 1, odds: 2.45}]}), клиент применяет дифф к локальному state.
На iOS: URLSessionWebSocketTask + Combine publisher для распределения обновлений по ViewModel'ам. На Android: OkHttp WebSocket + StateFlow / SharedFlow через BettingRepository. При потере соединения — reconnect с экспоненциальным backoff и повторная подписка на те же markets. Визуально — микроанимация изменения коэффициента (зелёный/красный flash при росте/падении через animate() в Compose или UIView.animate в UIKit).
Suspended markets. Перед крупным событием или при технических проблемах матч уходит в suspend — ставки заблокированы. Приложение получает событие {market_id: 123, status: "suspended"} и немедленно блокирует кнопку «Поставить» без перехода на другой экран. Если пользователь уже в процессе заполнения купона — показываем inline предупреждение.
Купон ставки и betslip
Betslip — технически самый сложный UI-компонент в betting-приложении. Пользователь добавляет несколько исходов — приложение считает accumulator (экспресс) odds в реальном времени: total_odds = outcome_1_odds × outcome_2_odds × ... × outcome_n_odds. При изменении любого из коэффициентов пока betslip открыт — обновление с анимацией и предложением принять новые условия (Accept Changes).
Bet placement flow:
- Пользователь нажимает «Поставить» → локальная валидация (баланс, мин/макс ставка).
- POST
/betsс{selections, stake, idempotency_key}→ сервер резервирует сумму. - Сервер возвращает
{bet_id, status: "accepted"/"pending"/"rejected", actual_odds}. - Если
actual_oddsизменились — показываем диалог «Коэффициент изменился с 2.50 на 2.45. Принять?».
idempotency_key (UUID, генерируется на клиенте) — обязателен. Дублированный POST при проблемах с сетью не должен создавать две ставки.
Геолокационный контроль
Лицензионные требования большинства юрисдикций — ставки только с разрешённой территории. На мобилке: запрашиваем CLLocationManager (requestWhenInUseAuthorization) или LocationManager (Android FusedLocationProviderClient) при открытии приложения. Координаты отправляются на сервер, сервер через GeoIP + device location принимает решение.
VPN detection: сравниваем IP-геолокацию с device GPS. Существенное расхождение (IP в другой стране) — флаг для дополнительной верификации, не немедленный бан.
Платежи и вывод
Пополнение/вывод в betting-приложениях работает через платёжные провайдеры (Stripe, Adyen, PayOp, локальные PSP). Нативный UI для ввода карты: Stripe iOS SDK (STPPaymentCardTextField) / Stripe Android SDK — карточные данные никогда не проходят через наш сервер, только токен. Для вывода — верификация личности (KYC) через Sumsub или аналог.
Apple Pay / Google Pay — стандартные для быстрого депозита: PKPaymentRequest / PaymentRequest через Google Pay API. Интеграция за 1–2 дня при готовом бэкенде.
Стек и архитектура
Нативная iOS + Android разработка предпочтительна для перформанс-критичных live-котировок. Flutter — допустим при едином flutter-team. React Native — только с JSI для WebSocket без JS thread bottleneck.
Clean Architecture: BettingRepository (WebSocket + REST), BetSlipViewModel (accumulator calculation, validation), PaymentRepository (PSP integration), GeoLocationService. Локальная БД: открытые ставки, история — Room/Core Data с миграциями.
Процесс работы
Аудит лицензионных требований и выбор юрисдикции → проектирование API + WebSocket контракта → разработка real-time котировок и betslip → платёжная интеграция → KYC → геолокационный контроль → QA (нагрузочное тестирование WebSocket при 1000+ одновременных обновлений) → публикация.
App Store: gambling-категория требует специального entitlement и доказательства лицензии. Google Play — аналогично, Gambling policy с региональными ограничениями.
Ориентиры по срокам
MVP (live и prematch котировки, одиночные и экспресс ставки, базовые платежи): 8–12 недель. Полноценная платформа с live streaming, cash out, многовалютностью и мобильным приложением для обеих платформ: 3–5 месяцев.







