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

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация подсчета шагов в мобильном приложении
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    874
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

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

Казалось бы, шаги — самая простая метрика. На деле: iOS и Android считают шаги по-разному, телефон в кармане и в руке даёт разные паттерны акселерометра, а задваивание данных между HealthKit и Google Fit — классическая жалоба пользователей в отзывах.

Два подхода: системный шагомер vs собственный алгоритм

Системный шагомер (рекомендуется)

iOS: CMPedometer — самый надёжный вариант. Считает шаги на уровне сопроцессора Motion Coprocessor (M-серия), не требует постоянной работы приложения:

let pedometer = CMPedometer()

guard CMPedometer.isStepCountingAvailable() else { return }

// Исторические данные
pedometer.queryPedometerData(from: startDate, to: endDate) { data, error in
    guard let data = data else { return }
    print("Шаги: \(data.numberOfSteps)")
    print("Дистанция: \(data.distance ?? 0) м")
    print("Этажи вверх: \(data.floorsAscended ?? 0)")
}

// Живые обновления
pedometer.startUpdates(from: Date()) { data, error in
    DispatchQueue.main.async {
        self.stepCount = data?.numberOfSteps.intValue ?? 0
    }
}

CMPedometer.startUpdates() продолжает работать даже когда приложение в фоне — данные накапливаются и приходят при следующем открытии. Батарея не тратится на высокочастотный опрос — всё на уровне железа.

Android: TYPE_STEP_COUNTER и TYPE_STEP_DETECTOR.

TYPE_STEP_COUNTER — накопительный счётчик с момента последней перезагрузки устройства. Сбрасывается при reboot. Нужно хранить базовое значение при первом запуске дня.

TYPE_STEP_DETECTOR — событие на каждый шаг. Для подсчёта в реальном времени.

val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
val stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)

val stepListener = object : SensorEventListener {
    override fun onSensorChanged(event: SensorEvent) {
        val totalSteps = event.values[0].toLong()
        // Вычитаем базовое значение, полученное при первом запуске
        val todaySteps = totalSteps - baseStepCount
        updateUI(todaySteps)
    }
    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}

sensorManager.registerListener(stepListener, stepSensor, SensorManager.SENSOR_DELAY_NORMAL)

SENSOR_DELAY_NORMAL — достаточно для шагомера. SENSOR_DELAY_FASTEST здесь бессмысленен и убивает батарею.

Собственный алгоритм (когда нужен)

Системный шагомер не работает на некоторых бюджетных Android-устройствах без TYPE_STEP_COUNTER (редко, но встречается). В этом случае — Peak Detection на акселерометре:

  1. Читаем TYPE_ACCELEROMETER на 25 Гц
  2. Вычисляем magnitude: sqrt(x² + y² + z²)
  3. Применяем low-pass фильтр: filtered = alpha * raw + (1 - alpha) * prev (alpha ≈ 0.1)
  4. Детектируем пик: filtered > threshold (обычно 10.5–11.5 м/с²) после перехода через baseline
  5. Минимальный интервал между шагами: 250–400 мс

Точность собственного алгоритма — 85–92% против 98%+ системного. Для большинства фитнес-приложений системный достаточен.

Интеграция с HealthKit / Health Connect

Шаги нужно писать в платформенное хранилище, иначе они не появятся в системном приложении «Здоровье» (iOS) или Health Connect (Android).

iOS — запись в HealthKit:

let stepType = HKQuantityType(.stepCount)
let stepSample = HKQuantitySample(
    type: stepType,
    quantity: HKQuantity(unit: .count(), doubleValue: Double(steps)),
    start: periodStart,
    end: periodEnd
)
healthStore.save(stepSample) { success, error in }

Android — Health Connect:

val stepsRecord = StepsRecord(
    startTime = periodStart,
    startZoneOffset = ZoneOffset.UTC,
    endTime = periodEnd,
    endZoneOffset = ZoneOffset.UTC,
    count = steps
)
healthConnectClient.insertRecords(listOf(stepsRecord))

Проблема задваивания

Если телефон передаёт данные в Google Fit, а приложение пишет их ещё и в Health Connect — пользователь видит двойное количество шагов в системных приложениях. Решение: не писать шаги самостоятельно, если разрешено чтение из системного шагомера. Читаем из системного источника, агрегируем, показываем в своём UI, в HealthKit/Health Connect НЕ пишем (или пишем с уникальным source identifier и предупреждаем пользователя о возможном дублировании).

Сроки

Реализация счётчика шагов с системным шагомером на одной платформе — 2–4 рабочих дня. С интеграцией в HealthKit/Health Connect, фоновой синхронизацией и виджетом — до 2 недель.