Лотерейний додаток виглядає простіше букмекерського — немає real-time котирувань, немає live dealer. Але у нього своя специфіка: розіграші зі строгим часовим вікном, верифікація квитків, миттєві розіграші (scratch cards) з вимогою плавної анімації та пікові навантаження перед дедлайном продажів. 5 років досвіду та понад 10 реалізованих проєктів дозволяють нам передбачати ці складнощі. Нижче розберемо ключові проблеми та їх вирішення.
Ключові проблеми мобільного додатку для лотереї
Як забезпечити чесний час при розіграші?
Лотерея закриває продажі квитків у момент розіграшу (або за N хвилин до). Додаток має точно відображати countdown та заблокувати покупку рівно в момент дедлайну. Проблема: Date() на пристрої можна перевести — сервер має бути джерелом правди часу. Отримуємо server time при відкритті додатку, обчислюємо зміщення від Date(), використовуємо скоригований час для countdown (serverNow + (Date() - syncedAt)). Дедлайн перевіряється і на сервері при кожній спробі покупки. Це виключає маніпуляції з таймером.
Вибір номерів та Quick Pick
Користувач вибирає числа (як у Keno або Powerball аналозі) або отримує Quick Pick (випадковий набір). Quick Pick на клієнті — CSPRNG (SecRandomCopyBytes на iOS, SecureRandom на Android), але фінальний вибір валідується та зберігається на сервері. Інтерфейс вибору чисел — grid з N комірок з multi-select, анімація вибору через withAnimation (SwiftUI) / animateContentChange (Compose).
Миттєві лотереї (scratch cards)
Візуально — шар срібла поверх зображення, який стирається жестом. Реалізація: Metal або SpriteKit на iOS, Canvas з PorterDuff.Mode.DST_OUT на Android. Поріг стирання — 70% площі (налаштовується) — відкриває весь приарт через SKTexture mask або Path coverage calculation. Результат визначається сервером при покупці квитка і передається зашифрованим: клієнт розшифровує тільки після повного стирання, запобігаючи перегляду результату до анімації.
Як реалізувати scratch card анімацію?
Процес створення скретч-карти:
- Підготувати маску стирання: шар срібла (сірий колір) над призовим зображенням.
- Обробити жести стирання: на iOS —
Metalз текстурою маски, на Android —CanvasзPorterDuff.Mode.DST_OUT. - Розрахувати відсоток стертої області: mask coverage > 70% → відкрити призове зображення.
- Результат (виграш/програш) зашифровано на сервері і дешифрується локально тільки після стирання.
Як організувати push-сповіщення про результати?
Сповіщення «Ви виграли!» або «Результати розіграшу» має приходити одразу після розіграшу. Схема: сервер проводить розіграш → перевіряє winning квитки → надсилає персоналізовані push через FCM/APNS. UNNotificationServiceExtension на iOS дозволяє додати rich notification — зображення виграшних чисел прямо у сповіщенні. Deep link зі сповіщення → екран результатів конкретного квитка.
Проблема пікових пушів: якщо 1 мільйон користувачів отримують push одночасно після великого розіграшу — FCM batch sending. Сервер надсилає не одним запитом, а через Firebase Admin SDK sendEach() батчами по 500 токенів, обробляючи InvalidRegistration (застарілі токени) для чищення бази.
Верифікація фізичних квитків
Якщо оператор має і роздрібні точки — потрібен QR/barcode scanning для верифікації паперових квитків через додаток. AVFoundation (AVCaptureSession + AVMetadataObjectTypeQRCode) на iOS, ML Kit Barcode Scanning на Android — швидше та надійніше ніж ZXing. Сканований код → API запит → відображення статусу квитка (winner/loser, prize amount).
Платежі
Купівля квитків: Apple Pay (PKPaymentRequest) та Google Pay для UX без friction. Card через Stripe/Braintree hosted fields. У ряді юрисдикцій лотерейні квитки — предмет державного регулювання, додаток зобов'язаний показувати responsible gambling warnings і дозволяти встановити ліміти на витрати.
| Помилка | Рішення |
|---|---|
| Неправильний час дедлайну через локальний час | Використовувати точний серверний час із синхронізацією при старті |
| Затримка push-сповіщень при масовій розсилці | Надсилати батчами по 500 токенів через Firebase Admin SDK |
| Некоректний результат скретч-карти через зміну маски | Шифрувати результат на сервері та дешифрувати тільки після стирання |
Чек-лист для запуску лотерейного додатку
- Налаштувати серверний час та синхронізацію з клієнтом
- Реалізувати CSPRNG для Quick Pick та валідацію на сервері
- Розробити scratch card анімацію через нативні Metal/Canvas
- Інтегрувати Apple Pay та Google Pay
- Налаштувати push-сповіщення з батчингом та deep links
- Додати QR-сканування для фізичних квитків
- Впровадити responsible gambling ліміти
- Протестувати deadline edge cases (переведення часу, офлайн)
Стек
Flutter або React Native — виправдані тут, оскільки немає жорстких вимог до real-time WebSocket продуктивності. Scratch card анімація — нативний модуль (Platform Channel / Native Module) для Metal/Canvas операцій. Core Data / Room для історії квитків та локального кешу результатів. Firebase для push.
Процес роботи
Аналіз лотерейної механіки та регуляторних вимог → дизайн білетного flow → розробка (купівля, scratch cards, результати, історія) → платіжна інтеграція → push-сповіщення → QA (включаючи deadline edge cases, офлайн сценарії) → публікація.
Орієнтири за термінами
| Версія | Термін | Склад |
|---|---|---|
| Базова | 4–8 тижнів | Числові лотереї, історія квитків, push, платежі |
| Розширена | 2–3 місяці | + Scratch cards, QR-сканування, responsible gambling інструменти |
Чому обирають нас?
Більше 5 років досвіду в мобільній розробці. Сертифіковані спеціалісти (Apple, Google). Гарантуємо дотримання App Store Review Guidelines (Section 4.2, 5.1) та вимог Google Play. Отримайте консультацію щодо вашого лотерейного проєкту — напишіть нам. Оцінимо ваш проєкт безкоштовно, зв'яжіться для консультації.







