Реализация фоновой записи геолокации в мобильном приложении

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

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

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

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

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

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

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

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

  • 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

Реализация фоновой записи геолокации в мобильном приложении

На Xiaomi с MIUI 14 foreground service убит через 8 минут после выключения экрана. Трек оборвался. Пользователь думает, что приложение работает — уведомление в статусбаре есть, иконка есть. Но FusedLocationProviderClient перестал получать обновления, потому что процесс убит батарейным менеджером MIUI.

Это самая распространённая причина сломанного геотрекинга на Android — и у неё нет универсального решения. Есть набор мер, которые вместе дают приемлемый результат.

Android: как выжить в агрессивных лаунчерах

Foreground Service — необходимый минимум. Без него трекинг не живёт нигде. Сервис запускается с startForeground(id, notification), тип FOREGROUND_SERVICE_TYPE_LOCATION (обязателен с Android 10). Уведомление должно показывать текущий статус — «идёт запись» или текущую скорость.

Автозапуск на MIUI. com.miui.securitycenter → «Автозапуск» — при первом запуске показываем Intent, направляющий пользователя в настройки. Это единственный способ выжить на Xiaomi. Аналогично для Huawei: com.huawei.systemmanager → «Управление батареей» → «Запустить вручную». Список intent'ов по производителям — в библиотеке AutoStarter (Android).

WakeLock — не помогает одиночно. PARTIAL_WAKE_LOCK удерживает CPU, но не защищает процесс от kill на уровне MIUI/EMUI. Используем в паре с foreground service.

Конфигурация LocationRequest. Для трекинга человека пешком: interval = 10_000 мс, fastestInterval = 5_000 мс, priority = Priority.PRIORITY_HIGH_ACCURACY. Для транспортного трекинга: interval = 3_000 мс. Для фоновой записи маршрута без спешки: interval = 30_000 мс с Priority.PRIORITY_BALANCED_POWER_ACCURACY — в 3 раза меньше расход батареи.

WorkManager как watchdog. Запускаем PeriodicWorkRequest каждые 15 минут (минимальный интервал WorkManager). Если foreground service не работает — watchdog его перезапускает. Не идеальное решение, но добавляет надёжность.

iOS: проще, но со своими ограничениями

На iOS CLLocationManager с allowsBackgroundLocationUpdates = true + background mode location в entitlements работает надёжно. iOS не убивает location services в фоне. Но есть нюансы:

pausesLocationUpdatesAutomatically = false обязательно. Иначе iOS сама решит приостановить обновления «для экономии батареи», когда пользователь долго стоит на месте.

desiredAccuracy. kCLLocationAccuracyBest даёт 5–10 метров, но высасывает батарею. kCLLocationAccuracyNearestTenMeters — достаточно для большинства сценариев трекинга. kCLLocationAccuracyHundredMeters с distanceFilter = 50 — для простой записи «где был».

Significant Location Changes. startMonitoringSignificantLocationChanges() — это не трекинг, а «был в другом районе города». Срабатывает при смене соты (~300–500 метров). Подходит для логирования посещённых мест, не для непрерывного маршрута.

App termination. Если пользователь смахнул приложение из свайпера — трекинг прекращается. iOS не поднимет приложение автоматически через location. Решение: при получении applicationWillTerminate показываем предупреждение «закрытие приложения остановит запись маршрута».

Типичные ошибки реализации

Ошибка Последствие Решение
Запись каждой точки в сеть отдельным HTTP-запросом Высокий расход батареи, частые ошибки сети Батч-буфер в памяти, отправка каждые 30 сек
Хранение трека только в памяти Потеря данных при kill процесса Персистентная очередь в SQLite
PRIORITY_HIGH_ACCURACY без необходимости Батарея садится за 4–5 часов Балансировать точность под сценарий
Не запрашивать SCHEDULE_EXACT_ALARM (Android 12+) WorkManager watchdog работает неточно Добавить permission и использовать AlarmManager

Батч-отправка координат

Каждая точка GPS — это 3 числа + timestamp. Отдельный HTTP-запрос на каждую точку — расточительство. Буфер в памяти (или SQLite если нужна надёжность) с отправкой каждые N секунд или M точек:

// Android: накапливаем в ViewModel, отправляем батчем
private val locationBuffer = mutableListOf<LocationPoint>()

fun onLocationUpdate(location: Location) {
    locationBuffer.add(location.toPoint())
    if (locationBuffer.size >= BATCH_SIZE || isTimeToFlush()) {
        sendBatch(locationBuffer.toList())
        locationBuffer.clear()
    }
}

На iOS аналогично через @Published var buffer: [CLLocation] в ObservableObject.

Итог

Надёжная фоновая геолокация — это не одна строка кода. Это foreground service + правильный LocationRequest + батч-буфер + watchdog + пользовательский онбординг с разрешениями на автозапуск. На iOS проще, на Android — больше edge-кейсов под конкретных производителей.

Реализация под один сценарий (пешеходный трекинг, автомобильный, полевые работы) занимает 3–5 рабочих дней. Если нужна кроссплатформенная реализация с учётом специфики всех Android-лаунчеров — около недели-двух.