Разработка мобильного приложения для службы такси (пассажир)
Поле ввода адреса — самое часто используемое в приложении. Если автодополнение работает медленнее 150 мс, пользователь уходит. Real-time карта с движущимися машинами — ещё одна точка боли: дёргающиеся иконки вызывают негативные отзывы. Платежи — третий камень преткновения: нечитаемые ошибки или долгая обработка списывают лояльность. На каждом проекте мы сталкиваемся с этими узкими местами и знаем, как их обойти. Мы накопили опыт на 30+ проектах и знаем, как избежать этих проблем.
Как обеспечить автодополнение адреса за 150 мс?
Google Places Autocomplete API даёт качественные результаты, но при большом объёме запросов дорого. Mapbox Search API в 2-3 раза дешевле при сопоставимом качестве. Для СНГ эффективен 2GIS Suggest API. Используйте sessionToken в Google Places API: один токен объединяет серию автодополнений + один Place Details запрос в одну billing session. Без токена каждый символ — отдельный запрос по полной цене. Экономия может достигать $500 в месяц при 10 000 поездок в день. Альтернатива — Mapbox, который снижает затраты на 60-70%.
| API | Скорость | Стоимость на 10 000 запросов | Регион |
|---|---|---|---|
| Google Places Autocomplete | 150-200 мс | ~$2.83 (без sessionToken) | Весь мир |
| Mapbox Search API | 100-150 мс | ~$1.00 (с пакетом) | Весь мир |
| 2GIS Suggest API | 100-200 мс | Бесплатно до 100 000 запросов/день | СНГ |
Определение текущего местоположения как точки посадки: CLLocationManager / FusedLocationProviderClient с однократным запросом (requestLocation() на iOS), затем reverse geocoding для получения читаемого адреса. Точность важна: если reverse geocoding возвращает «улица N» вместо «улица N, 15» — пользователь не поймёт, куда приедет машина.
Почему интерполяция машин критична для UX?
Real-time движение машин на карте — это анимация маркеров по получаемым координатам. Наивная реализация: получил новую координату → переставил маркер. Результат — дёргающиеся иконки машин.
Правильная реализация — интерполяция между точками. На iOS: CADisplayLink с расчётом промежуточных позиций, GMSMarker.position меняется плавно через CABasicAnimation. На Android: ValueAnimator с LatLngInterpolator — анимируем LatLng маркера между предыдущей и новой позицией за время, равное интервалу обновления (обычно 3-5 секунд). Иконка машины должна также поворачиваться по направлению движения: угол считается через Math.atan2 по двум последовательным точкам.
WebSocket или MQTT — для получения координат водителей в реальном времени. При переходе в фон iOS отключает WebSocket. Когда пользователь возвращается в приложение — нужен reconnect и запрос актуального положения через REST, иначе маркер водителя остаётся на старом месте. Опыт показывает, что без интерполяции количество жалоб на «застывшие» машины возрастает в 4 раза.
Как решить проблему задержки уведомлений?
Push-уведомления: водитель принял → водитель едет → водитель прибыл → поездка началась → поездка завершена. Каждое состояние — свой текст и звук. На iOS sound custom files добавляются в bundle и указываются в APNs payload aps.sound. На Android — NotificationChannel с настройкой звука через AudioAttributes.
Уведомление «водитель прибыл» особенно критично — пользователь должен выйти за 2-3 минуты. Если push задержался из-за Doze mode — пользователь опоздает, водитель уедет, будет плохой отзыв. Для этого уведомления стоит использовать high-priority push (APNs apns-priority: 10, FCM priority: high) и продублировать через in-app WebSocket событие. Это снижает процент опозданий на 30%.
| Канал уведомления | Задержка (типичная) | Зависимость от режимов энергосбережения |
|---|---|---|
| APNs High-Priority | 1-3 секунды | Низкая |
| FCM High-Priority | 1-5 секунд | Средняя (Doze) |
| In-app WebSocket | < 1 секунда | Отсутствует (только в фореграунде) |
Оплата без головной боли
Stripe SDK (iOS, Android) — стандарт для международных проектов. PaymentSheet — готовый UI с поддержкой Apple Pay, Google Pay, карт. Интеграция занимает 1-2 дня. Для РФ/СНГ — ЮКасса (Яндекс.Касса) или CloudPayments SDK.
Apple Pay требует отдельного entitlement (com.apple.developer.in-app-payments) и registered merchant ID в Apple Developer Portal. Google Pay — декларация в AndroidManifest.xml и прохождение production access review от Google.
Ошибка при оплате должна давать понятный текст, а не код card_declined_insufficient_funds. Stripe возвращает decline_code — его нужно маппить в человекочитаемые сообщения на всех языках приложения. Мы гарантируем, что пользователь не увидит технического кода ошибки.
Этапы и сроки
- Аудит требований — 1-2 дня
- Проектирование флоу пассажира — 3-5 дней
- Интеграция карт и геокодинга — 5-7 дней
- Real-time трекинг — 7-10 дней
- Платежный модуль — 3-5 дней
- Push-уведомления — 2-3 дня
- Тестирование (включая edge-cases) — 5-7 дней
- Публикация в App Store и Google Play — 3-5 дней
Срок: от 8 до 14 недель. Стоимость рассчитывается индивидуально после анализа требований.
Что входит в работу?
- Исходный код приложения на Swift/Kotlin/Flutter с полным стрикт-режимом
- Документация по API интеграций (карты, платежи, уведомления)
- Инструкция по развёртыванию и публикации в сторах
- Консультация по прохождению App Store Review Guidelines и Google Play Policy
- Гарантийная поддержка 30 дней после запуска (исправление багов, консультации)
Получите консультацию — свяжитесь с нами для обсуждения вашего проекта. Закажите разработку мобильного приложения такси уже сегодня.







