Разработка мобильного приложения для фитнес-трекера
Фитнес-приложение — это не просто счётчик шагов и красивые графики. За каждым датчиком — отдельный API с ограничениями по частоте опроса, политиками фонового доступа и разрешениями, которые Apple и Google ужесточают с каждым релизом. Нативное приложение, которое правильно работает с CoreMotion, HealthKit, Google Fit и Health Connect одновременно — значительно сложнее большинства других мобильных категорий.
Ключевые технические решения
Какие датчики и зачем
| Датчик | iOS API | Android API | Типичная частота |
|---|---|---|---|
| Акселерометр | CMMotionManager | SensorManager (TYPE_ACCELEROMETER) | 50–100 Гц |
| Гироскоп | CMMotionManager | SensorManager (TYPE_GYROSCOPE) | 50–100 Гц |
| Барометр | CMAltimeter | SensorManager (TYPE_PRESSURE) | 1–10 Гц |
| Шагомер | CMPedometer | StepCounterSensor / Health Connect | Аккумулятивно |
| Пульс | HealthKit (от Watch) | Health Connect | По событию |
| GPS | CLLocationManager | FusedLocationProviderClient | 1 Гц для трекинга |
Высокочастотный опрос акселерометра (100 Гц) в фоне — прямой путь к разряду батареи за 3–4 часа. На iOS CMMotionManager.startDeviceMotionUpdates() с UIBackgroundModes: processing и BGProcessingTask позволяет делать батчевую обработку, но фоновое выполнение ограничено 30 секундами. На Android WorkManager с ExpeditedWork или Foreground Service с типом FOREGROUND_SERVICE_TYPE_HEALTH.
CoreMotion и детекция активности
CMMotionActivityManager.startActivityUpdates() даёт готовые активности: walking, running, cycling, automotive, stationary. Это лучше, чем самостоятельно анализировать акселерометр для большинства задач. Но есть нюанс: классификация приходит с задержкой 5–30 секунд (iOS усредняет данные) и работает только при разрешении CMMotionActivityManager.isActivityAvailable() — на некоторых iPod Touch эта функция недоступна.
Для собственного алгоритма детекции шага из акселерометра: пик вертикального ускорения (ось Y) с порогом > 1.2g при частоте 50 Гц. Между двумя пиками минимальный интервал 300 мс (частота шага не выше ~3.3 Гц). Это базовая реализация. Точный алгоритм учитывает расположение телефона (в кармане/в руке/в рюкзаке) через классификатор на CoreML или TensorFlow Lite.
Трекинг GPS-маршрута
CLLocationManager с desiredAccuracy: kCLLocationAccuracyBest в фоне требует Always разрешение и UIBackgroundModes: location. Без этого после 10–15 секунд фона обновления прекращаются. На Android FusedLocationProviderClient с LocationRequest.PRIORITY_HIGH_ACCURACY в Foreground Service.
Проблема: городской каньон и туннели — GPS теряется, трек разрывается. Решение: при horizontalAccuracy > 30 м — не записывать точку. Dead reckoning на основе акселерометра/гироскопа на время потери сигнала — сложнее, но даёт непрерывный трек.
Запись трека в формате GPX: стандартный XML, каждая точка — <trkpt lat="..." lon="..."> с <ele> и <time>. Экспорт/импорт GPX — стандарт де-факто для совместимости с Garmin, Strava, Komoot.
Интеграция с платформенными хранилищами здоровья
На iOS все записи тренировок нужно сохранять через HKWorkout в HealthKit. Без этого приложение не появится в «Здоровье» и пользователи воспримут это как баг. HKWorkoutBuilder — правильный путь: позволяет добавлять семплы (ЧСС, дистанция, калории) по ходу тренировки, а не пачкой в конце. HKWorkoutRoute — сохраняет GPS-трек, связанный с тренировкой.
На Android — Health Connect (androidx.health.connect.client). Пишем ExerciseSessionRecord с типом активности, DistanceRecord, TotalCaloriesBurnedRecord. Важно: Health Connect требует лицензионного соглашения с Google и отдельного review при публикации в Play Store если приложение читает медицинские данные.
Фоновое выполнение и батарея
Самое сложное в фитнес-приложении — корректная работа в фоне без убийства батареи. Принципы:
- Не держать высокочастотный сенсор активным всё время — включать только во время активной тренировки
- На iOS использовать
BGAppRefreshTaskдля синхронизации статистики (не для самого трекинга) - Кэшировать данные локально в SQLite / Core Data, синхронизировать с сервером батчами по завершению тренировки
-
CMPedometerиStepCounterSensor— системные шагомеры, они работают на уровне ОС без нашего участия, данные только читаем
Сроки
Приложение с базовыми активностями (ходьба, бег, велосипед), GPS-трекингом, HealthKit/Health Connect и статистикой — 8–14 недель. С кастомными алгоритмами детекции активности, ML-классификацией и социальными функциями — от 4 месяцев. Оценка после анализа требований к датчикам и платформам.







