Разработка мобильного приложения для навигации по городу
Навигационное приложение — один из самых технически насыщенных типов мобильных продуктов. Здесь сходятся GPS, картографические данные, алгоритмы маршрутизации, TTS и real-time трафик. Разрабатывать с нуля навигационный движок нет смысла — но правильно интегрировать готовые SDK и выстроить пользовательский опыт — отдельная серьёзная задача.
Выбор картографической платформы
Первое архитектурное решение — какой SDK использовать. Это определяет стоимость, возможности и ограничения на годы вперёд.
| Платформа | Маршрутизация | Трафик | Офлайн | Кастомный стиль | Стоимость |
|---|---|---|---|---|---|
| Google Maps SDK + Navigation SDK | Отлично | Да (реальное время) | Нет | Ограниченно | Высокая при объёме |
| Mapbox | Отлично | Через Isochrone API | Да (OfflineManager) | Полная свобода | Средняя |
| HERE Maps | Хорошо | Да | Да | Средняя | Средняя |
| 2GIS | Хорошо для СНГ | Ограниченно | Да | Ограниченно | Низкая для СНГ |
| OpenStreetMap + OSRM | Open Source | Нет | Зависит от хостинга | Полная | Серверные расходы |
Google Navigation SDK даёт лучший turn-by-turn опыт из коробки, но лицензия запрещает отображать конкурирующие сервисы рядом с картой. Mapbox — максимальная гибкость, офлайн-карты, кастомные стили через Mapbox Studio.
GPS и локализация в реальном времени
CLLocationManager / FusedLocationProviderClient — базовый GPS. Для навигации важно:
-
desiredAccuracy: kCLLocationAccuracyBestForNavigation(iOS) — максимальная точность, высокое энергопотребление -
distanceFilter: 5метров — обновление при каждом значимом движении - Фоновая работа:
locationbackground mode +allowsBackgroundLocationUpdates = true
Map matching — привязка GPS-точек к дорожной сети. Raw GPS прыгает по 10-30 метров, особенно между зданиями. Mapbox Map Matching API принимает набор координат и возвращает трек, привязанный к дорогам. Без этого машина «едет сквозь здания» на карте.
Для пешеходной навигации map matching важен меньше — пешеход может идти где угодно, строгая привязка к дорогам мешает.
Определение направления движения
Compass heading (CLHeading / SensorManager.getDefaultSensor(TYPE_ROTATION_VECTOR)) — для пешехода. Orientation of velocity vector — для автомобильной навигации: направление берётся из последних двух GPS-точек, а не из компаса (точнее при движении). При скорости < 5 км/ч — переключаемся обратно на компас.
Поворот карты по направлению движения: GMSCameraUpdate.setTarget(_:bearing:) (Google) или MapboxMap.setCamera(CameraOptions(bearing:)). Плавный поворот через анимацию с CATransaction / анимированным camera update.
Turn-by-turn и голосовые подсказки
Готовые SDK (Mapbox Navigation SDK, Google Navigation SDK) предоставляют NavigationViewController / MapboxNavigationView — полноценный UI навигации. Кастомизация: цвета, иконки, скрытие/показ элементов через configuration objects.
Для голосовых подсказок: Mapbox Navigation SDK использует SpeechSynthesizer с возможностью замены на Amazon Polly или кастомный TTS. Google Navigation SDK — встроенный TTS без прямого доступа. AVSpeechSynthesizer (iOS) / Android TextToSpeech если строим подсказки самостоятельно.
Очень важно: прерывание воспроизводимого аудио (музыки, подкаста) на время подсказки. AVAudioSession.sharedInstance().setCategory(.playback, options: .duckOthers) на iOS — снижает громкость другого аудио, не останавливает. AudioFocusRequest.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK на Android — аналог.
Пересчёт маршрута и альтернативные маршруты
Отклонение от маршрута → пересчёт. Mapbox Navigation SDK делает это автоматически при отклонении более чем на RouteOptions.maximumAllowedDivergence (по умолчанию 20 метров от маршрута). Пересчёт занимает 0.5-2 секунды, за это время навигация продолжается по старому маршруту.
Альтернативные маршруты при старте: Google Directions API и Mapbox Directions API возвращают до 3 альтернатив. Отображение на карте тонкими линиями, tap для переключения.
Учёт трафика и ETA
Реальное время прибытия с учётом трафика — через Directions API с departing_now. Обновление ETA каждые 30-60 секунд при изменении дорожной обстановки. Если ожидаемое время прибытия увеличилось значительно — пересчёт маршрута автоматически или по предложению пользователю.
Офлайн-навигация
Mapbox OfflineManager — скачать тайлы региона. Маршрутизация офлайн — OSRM или Valhalla, развёрнутые на сервере, кешированные маршруты. Для полного офлайна на устройстве — GraphHopper Embedded (Java), интеграция в Android через JNI или мобильный граф-файл (~100-500 MB для страны).
Этапы: выбор картографической платформы → GPS и map matching → навигационный движок → голосовые подсказки → офлайн → тестирование на реальных маршрутах → публикация.
Срок: от 10 до 20 недель. Стоимость рассчитывается индивидуально.







