Реализация отправки геолокации в чате мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация отправки геолокации в чате мобильного приложения
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация отправки геолокации в чате мобильного приложения

Кнопка «Поделиться местоположением» в чате выглядит простой фичей, пока не встречаешься с тем, что iOS 17 разграничивает разовое местоположение (requestLocation) и постоянный мониторинг (startUpdatingLocation), а Android 10+ требует отдельного разрешения ACCESS_BACKGROUND_LOCATION для фоновых обновлений. Кроме того, живая геолокация (когда собеседник видит, куда ты едешь в реальном времени) — это принципиально другая архитектура по сравнению с одиночным снимком координат.

Разовое местоположение vs живое отслеживание

Для разового «где я сейчас» достаточно запросить координаты один раз, сформировать сообщение со статической картой и отправить его в чат как attachment. Собеседник видит превью карты с маркером.

Живое отслеживание — это отдельный тип сообщения в чате (например, type: "live_location") с временем жизни. Google Maps Messenger и WhatsApp ограничивают трансляцию 15-60 минутами. По истечении времени бекенд автоматически закрывает сессию, и сообщение переходит в «статическое» состояние.

Разовое на iOS

import CoreLocation

class LocationManager: NSObject, CLLocationManagerDelegate {
    private let manager = CLLocationManager()
    var onLocation: ((CLLocation) -> Void)?

    func requestOnce() {
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyHundredMeters
        manager.requestWhenInUseAuthorization()
        manager.requestLocation() // однократный запрос
    }

    func locationManager(_ manager: CLLocationManager,
                         didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else { return }
        onLocation?(location)
    }
}

requestLocation() даёт ровно одно обновление и останавливается. Используйте kCLLocationAccuracyHundredMeters — для чата точность до метра не нужна, а батарею экономит.

Живая геолокация: архитектура

Трансляция текущего положения требует трёх слоёв:

  1. Мобильный клиент-отправитель периодически пишет координаты на сервер
  2. Бекенд хранит последние координаты и рассылает обновления подписчикам (WebSocket / SSE)
  3. Мобильный клиент-получатель принимает обновления и двигает маркер на карте

На Android обновления координат в фоне — через FusedLocationProviderClient с WorkManager или ForegroundService. С WorkManager одним не обойтись: PeriodicWorkRequest имеет минимальный интервал 15 минут, что для живой геолокации бесполезно. Нужен ForegroundService с уведомлением в статусбаре — пользователь должен видеть, что приложение активно использует GPS.

class LocationTrackingService : Service() {
    private lateinit var fusedLocationClient: FusedLocationProviderClient
    private val locationCallback = object : LocationCallback() {
        override fun onLocationResult(result: LocationResult) {
            result.lastLocation?.let { location ->
                sendLocationToServer(location.latitude, location.longitude)
            }
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        startForeground(NOTIFICATION_ID, buildNotification())
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 5000L)
            .setMinUpdateIntervalMillis(3000L)
            .build()
        fusedLocationClient.requestLocationUpdates(request, locationCallback, mainLooper)
        return START_STICKY
    }
}

На iOS живая трансляция в фоне работает через startUpdatingLocation с allowsBackgroundLocationUpdates = true и ключом UIBackgroundModes: location в Info.plist. Без этого ключа — краш ещё в разработке, а не на ревью.

Отображение на карте у получателя

Получатель видит маркер собеседника поверх собственного местоположения. Анимация перемещения — обязательна, иначе маркер «прыгает».

Сообщение в чате с живой геолокацией содержит session_id. Получатель подписывается на WebSocket-канал этой сессии:

ws://api.example.com/location-sessions/{session_id}

Каждые N секунд сервер публикует {lat, lng, bearing, accuracy}. Bearing нужен для поворота иконки в направлении движения.

Статическое превью карты

Для разового местоположения в пузыре чата рендерим статическое изображение через Google Static Maps API или MapKit Snapshot:

// iOS MapKit Snapshot
let options = MKMapSnapshotter.Options()
options.region = MKCoordinateRegion(
    center: coordinate,
    latitudinalMeters: 500,
    longitudinalMeters: 500
)
options.size = CGSize(width: 240, height: 160)

MKMapSnapshotter(options: options).start { snapshot, _ in
    guard let snapshot = snapshot else { return }
    let image = snapshot.image
    // отображаем в ячейке чата
}

Снимок рендерится асинхронно — не блокирует UI при быстром скролле.

Сроки

2–3 дня для разового местоположения со статическим превью. Живая трансляция с ForegroundService / background mode — 4–6 дней. Стоимость рассчитывается индивидуально.