Реализация AI-мониторинга здоровья по данным датчиков в мобильном приложении
Apple Watch передаёт 30 измерений пульса в минуту. Fitbit отдаёт SpO2 каждые 5 секунд. Смысл не в сборе этих цифр — смысл в том, чтобы модель сказала «что-то не так» раньше, чем это почувствует пользователь.
Источники данных датчиков
iOS: HealthKit
HealthKit — единственный правильный способ получать данные здоровья на iOS. Прямые запросы к Bluetooth-датчикам без HealthKit нарушают гайдлайны App Store.
import HealthKit
class HealthDataCollector {
private let healthStore = HKHealthStore()
func requestAuthorization() async throws {
let types: Set<HKQuantityType> = [
HKQuantityType(.heartRate),
HKQuantityType(.oxygenSaturation),
HKQuantityType(.stepCount),
HKQuantityType(.heartRateVariabilitySDNN),
HKQuantityType(.restingHeartRate)
]
try await healthStore.requestAuthorization(toShare: [], read: types)
}
func observeHeartRate(handler: @escaping (Double) -> Void) {
let heartRateType = HKQuantityType(.heartRate)
let query = HKAnchoredObjectQuery(
type: heartRateType,
predicate: nil,
anchor: nil,
limit: HKObjectQueryNoLimit
) { _, samples, _, _, _ in
guard let samples = samples as? [HKQuantitySample] else { return }
samples.forEach { sample in
let bpm = sample.quantity.doubleValue(
for: HKUnit(from: "count/min")
)
handler(bpm)
}
}
query.updateHandler = { _, samples, _, _, _ in
guard let samples = samples as? [HKQuantitySample] else { return }
samples.forEach { sample in
handler(sample.quantity.doubleValue(for: HKUnit(from: "count/min")))
}
}
healthStore.execute(query)
}
}
HKAnchoredObjectQuery — правильный выбор для наблюдения в реальном времени. Обычный HKSampleQuery делает снимок и не обновляется.
Android: Health Connect + датчики напрямую
Health Connect (API 26+) — аналог HealthKit для Android. Агрегирует данные от Galaxy Health, Fitbit, Garmin. Прямой доступ к датчикам через SensorManager:
class SensorCollector(private val context: Context) : SensorEventListener {
private val sensorManager = context.getSystemService(SensorManager::class.java)
private val heartRateSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE)
fun startMonitoring() {
sensorManager.registerListener(
this,
heartRateSensor,
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_HEART_RATE) {
val bpm = event.values[0]
val accuracy = event.accuracy // SENSOR_STATUS_ACCURACY_HIGH требуем
if (accuracy >= SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM) {
processHeartRate(bpm)
}
}
}
}
Проверка accuracy — обязательна. SENSOR_STATUS_UNRELIABLE (0) даёт артефакты: пульс 255 bpm на мокрой коже датчика.
AI-анализ: детекция аномалий
Задача — выявить отклонения от персональной нормы. Не от медицинских норм (это не медицинский прибор), а от нормы конкретного пользователя.
Isolation Forest — хорошо работает для многомерных временных рядов с небольшим набором фич. Тренируем на «нормальном» поведении за 2–4 недели, выявляем выбросы. Конвертируется в CoreML через coremltools.converters.sklearn.
Скользящие статистики + z-score — проще, интерпретируемее, не требует ML:
func detectAnomaly(currentHR: Double, history: [Double]) -> AnomalyLevel {
let mean = history.reduce(0, +) / Double(history.count)
let variance = history.map { pow($0 - mean, 2) }.reduce(0, +) / Double(history.count)
let stdDev = sqrt(variance)
let zScore = abs(currentHR - mean) / stdDev
switch zScore {
case 0..<2.0: return .normal
case 2.0..<3.0: return .elevated
default: return .alert
}
}
z-score > 3 — статистически значимая аномалия. Но нужен контекст: пульс 160 bpm после WorkoutStart в HealthKit — норма, тот же пульс в покое — аномалия. Контекст активности подключаем через CMMotionActivityManager (iOS) или ActivityRecognitionClient (Android).
Персональные рекомендации
На основе агрегированных паттернов (HRV, пульс в покое, шаги, качество сна) строим систему рекомендаций. Не «занимайтесь спортом» — а «у вас HRV снизился на 18% за 3 дня, что обычно коррелирует с недосыпом — сегодня лучше лёгкая тренировка».
Рекомендации реализуем как rule-based систему поверх ML-аналитики: ML выявляет паттерн, правила превращают его в конкретное сообщение. Rule engine проще тестировать и регулировать, чем «черный ящик».
Приватность и регуляторика
Данные здоровья — sensitive data. GDPR и Apple Review требуют явного consent перед каждым типом данных. Хранение на сервере должно быть зашифрованным (AES-256 at rest, TLS 1.3 in transit).
Если приложение позиционируется как медицинское (диагностика, лечение) — нужна FDA 510(k) clearance (США) или CE marking (EU). Для wellness-приложений без медицинских claims эта регуляторика не применяется — но маркетинговые тексты должны это учитывать.
Процесс работы
Проектирование data pipeline: источники → нормализация → хранение. Разработка ML-модели детекции аномалий, тренировка и валидация. Конвертация в CoreML/TFLite. Интеграция с HealthKit / Health Connect. UI-компоненты: дашборд здоровья, алерты, рекомендации. Тестирование на реальных носимых устройствах.
Ориентиры по срокам
Базовый мониторинг с z-score детекцией и дашбордом — 2–3 недели. Полноценная AI-система с Isolation Forest, персонализированными рекомендациями и фоновым обновлением модели — 4–8 недель.







