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

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
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

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

Трекинг сна на телефоне без носимого — это акселерометр под подушкой или матрасом. С носимым — ЧСС + акселерометр для классификации фаз. Оба подхода работают, но имеют принципиально разные точности и технические сложности.

Без носимого: акселерометр как датчик движения

Классика — телефон кладут рядом на матрас. Движения тела во сне передаются через матрас к телефону. Задача: классифицировать периоды движения (беспокойный сон, пробуждения) и покоя (глубокий/лёгкий сон).

Алгоритм:

  1. Записываем акселерометр на 10 Гц (батарейно-оптимально, достаточно для детекции движений тела)
  2. Каждые 30 секунд — эпоха: считаем activity_count = sum(|delta_x| + |delta_y| + |delta_z|) за эпоху
  3. Классификация: activity_count < threshold → SLEEP, > threshold → WAKE
  4. Паттерны из N эпох → определяем начало и конец сна

Порог активности подбирается эмпирически — зависит от расположения телефона, жёсткости матраса. Поэтому первые 3–7 ночей — калибровка через feedback («я заснул в 23:15, данные верны?»).

Точность определения фаз сна (REM/N1/N2/N3) — ниже 60% без ЧСС. Только движения — это грубое деление на «спокойный/беспокойный». Если продукт претендует на медицинский класс — нужен носимый датчик.

С носимым: HealthKit Sleep / Health Connect Sleep

iOS + Apple Watch:

Apple Watch автоматически записывает сон через собственные алгоритмы (акселерометр + ЧСС + кожная температура на Series 8+). Результат — в HealthKit как HKCategoryValueSleepAnalysis:

let sleepType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!

let query = HKSampleQuery(
    sampleType: sleepType,
    predicate: HKQuery.predicateForSamples(withStart: startDate, end: endDate),
    limit: HKObjectQueryNoLimit,
    sortDescriptors: [NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true)]
) { _, samples, _ in
    guard let samples = samples as? [HKCategorySample] else { return }
    samples.forEach { sample in
        switch sample.value {
        case HKCategoryValueSleepAnalysis.asleepCore.rawValue:
            // N1/N2 — лёгкий сон (watchOS 9+)
        case HKCategoryValueSleepAnalysis.asleepDeep.rawValue:
            // N3 — глубокий сон
        case HKCategoryValueSleepAnalysis.asleepREM.rawValue:
            // REM
        case HKCategoryValueSleepAnalysis.awake.rawValue:
            // Пробуждение
        default: break
        }
    }
}

До watchOS 9 была только inBed и asleep — без фаз. Если приложение должно показывать фазы сна от Apple Watch — минимум iOS 16 / watchOS 9.

Android + Health Connect:

val response = healthConnectClient.readRecords(
    ReadRecordsRequest(
        recordType = SleepSessionRecord::class,
        timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
    )
)

response.records.forEach { session ->
    val duration = Duration.between(session.startTime, session.endTime)
    session.stages.forEach { stage ->
        when (stage.stage) {
            SleepSessionRecord.STAGE_TYPE_DEEP -> { /* глубокий */ }
            SleepSessionRecord.STAGE_TYPE_REM -> { /* REM */ }
            SleepSessionRecord.STAGE_TYPE_LIGHT -> { /* лёгкий */ }
            SleepSessionRecord.STAGE_TYPE_AWAKE -> { /* пробуждение */ }
        }
    }
}

Запись сна (собственные данные)

Если приложение само анализирует сон (через акселерометр телефона):

iOS — запись в HealthKit:

let sleepSample = HKCategorySample(
    type: HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!,
    value: HKCategoryValueSleepAnalysis.asleepCore.rawValue,
    start: phaseStart,
    end: phaseEnd
)
healthStore.save(sleepSample) { success, error in }

Умный будильник

Фишка большинства трекеров сна — будить в «лёгкую» фазу в пределах окна (например, ±30 мин от желаемого времени). Реализация на телефоне: приложение активно в фоне, анализирует акселерометр, при обнаружении активности в окне будильника — срабатывает через UNUserNotificationCenter (iOS) или AlarmManager.setAlarmClock() (Android).

AlarmManager.setAlarmClock() — единственный будильник на Android, который гарантированно срабатывает при строгом режиме экономии батареи (Doze mode). Обычные setExact() и setAlarmClock() могут задержаться на несколько минут.

Типичные ошибки

  • Не учитывать разрыв сна (человек встал ночью на 20 минут) — алгоритм разбивает одну сессию на две
  • Забыть про летнее/зимнее время — временные метки в UTC, перевод в локальное время только для отображения
  • Не фильтровать «сон» продолжительностью < 30 минут — дневной отдых или ошибки классификации попадают в статистику

Сроки

Базовый трекер с акселерометром и будильником — 3–5 недель. С интеграцией HealthKit/Health Connect, фазами сна и аналитикой за период — 6–10 недель.