Розроблення мобільного застосунку для доставки їжі (кур'єр)
Кур'єр доставки їжі — специфічна роль: короткі маршрути (1-5 км), багато замовлень за зміну, часто велосипед або самокат, жорсткий часовий інтерес (гаряча їжа). Застосунок має працювати швидко, з мінімальною кількістю натисків на ключові дії та точно показувати шлях до ресторану та до клієнта.
Отримання та підтвердження замовлення
Нове замовлення — push-сповіщення з таймером. У кур'єра є 30-45 секунд щоб прийняти або відхилити. Якщо не відповів — замовлення йде наступному. На екрані: адреса ресторану, адреса клієнта, відстань, розраховане час, вартість замовлення для розуміння ваги.
Таймер на UI — круговий прогрес-бар, зворотний відлік. На iOS реалізується через CAShapeLayer з анімацією strokeEnd. На Android — кастомний View з Canvas.drawArc. Таймер клієнтський, синхронізований з сервером за timestamp створення офера, а не за моментом отримання push (push може затримуватися).
Критична помилка яку ми бачили: таймер рахується від моменту отримання push. FCM затримав push на 8 секунд — кур'єр бачить 22 секунди замість 30, думає що встиг натиснути «прийняти» в останній момент, але сервер вже розподілив замовлення. Рішення: в payload push — offer_created_at, клієнт рахує різницю з Date.now().
Навігація між ресторан ↔ клієнт
Два етапи маршруту: спочатку до ресторану (забрати), потім до клієнта (доставити). На кожному етапі — turn-by-turn навігація. Для велокур'єра та пішого — пішеходний маршрут, для авто — автомобільний. Визначення режиму: або кур'єр вибирає вручну при реєстрації, або автоматично за швидкістю руху (GPS speedometer: якщо більше 15 км/ч — авто, інакше пеший/вело).
Mapbox Navigation SDK хорош тим, що підтримує cycling та walking профілі з коробки. Google Maps Navigation SDK (GA з 2023) також підтримує, але дорожче при великих обсягах.
Одночасно кілька замовлень
Продвинута функція (Яндекс.Лавка, Delivery Club «пачка»): кур'єр бере 2-3 замовлення з одного ресторану, розвозить по різним адресам. Маршрут — послідовність точок з оптимальним порядком. Waypoints в Directions API, на клієнті — список точок з кнопкою «виконано» для кожної.
Підтвердження отримання замовлення в ресторані
Кур'єр приходить у ресторан, бере замовлення. Підтвердження: сканування QR на чеку (найнадійніше) або натиск кнопки «забрав» (просто, але без верифікації). QR-сканування через MLKit / Vision працює за 0.5-1 секунду. QR на чеку містить order_id — сервер верифікує.
Детектування нахождення в ресторані через GPS-геофенс (радіус 50-100 метрів) — автоматичне появлення кнопки «забрав» тільки коли кур'єр реально у ресторану. Це знижує помилкові натиски «забрав» з іншого місця.
Чаєві та рейтинг
Після доставки — екран з пропозицією залишити чаєво (опціонально). Stripe Payment Intents для постплати чаєв. Клієнт ставить оцінку кур'єру — агрегується в профілі.
Кур'єр після зміни бачить суму заробітку, кількість доставок, середній рейтинг. SwiftCharts (iOS 16+) або MPAndroidChart для простого bar chart по годинах зміни.
Офлайн та нестабільна мережа
Велокур'єр у підвальному ресторані — немає мережі. Критичні дані (адреса клієнта, номер телефону, код домофону) мають бути доступні офлайн, кешовані при отриманні замовлення. Решта — з graceful degradation.
Retry при підтвердженні статусу: якщо «доставив» не дійшло — повторювати з exponential backoff, поки не буде підтвердження від сервера. Кур'єр не має вручну «відправляти ще раз».
Термін: від 6 до 10 тижнів. Вартість розраховується індивідуально.







