Разработка мобильного приложения для доставки еды (курьер)
Курьер доставки еды — специфичная роль: короткие маршруты (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 недель. Стоимость рассчитывается индивидуально.







