AI-Моніторинг здоров'я по даних датчиків мобільного додатку
Apple Watch передає 30 вимірювань пульсу в хвилину. Fitbit надає SpO2 кожні 5 секунд. Смисл не в збіранні цих цифр—смисл у тому, щоб модель сказала "щось не так" раніше, ніж це почувається користувачем.
Джерела даних датчиків
iOS: HealthKit
HealthKit—єдиний правильний спосіб отримувати дані здоров'я на iOS. Прямі запити до датчиків без 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—правильний вибір для real-time спостереження. Стандартна 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 виявляє паттерн, правила перетворюють його на конкретне повідомлення. Простіше тестувати та регулювати, ніж "чорну скриню".
Приватність та регуляторика
Дані здоров'я—sensitive. GDPR та Apple Review вимагають явної згоди для кожного типу даних. Зберігання на сервері повинно бути зашифрованим (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 тижнів.







