אפליקציית ניטור הבריאות שלנו מבוססת בינה מלאכותית משתמשת ב-HealthKit וב-Health Connect כדי לאסוף נתונים מחיישנים לבישים, ולאחר מכן מיישמת למידת מכונה (z-score, Isolation Forest) לזיהוי חריגות והמלצות מותאמות אישית, תוך תמיכה בפיתוח ל-iOS ול-Android.
איסוף נתונים מחיישנים לבישים לניתוח בינה מלאכותית
מפתחים רבים מתמודדים עם הבעיה: חיישנים פולטים זרמי נתונים גולמיים, אך ללא הקשר הם חסרי תועלת. לדוגמה, דופק של 120 פעימות לדקה עשוי להיות תקין במהלך ריצה אך חריג במנוחה. אנו פותרים זאת על ידי בניית צינור נתונים שלוקח בחשבון את פעילות המשתמש באמצעות CMMotionActivityManager ב-iOS ו-ActivityRecognitionClient ב-Android. התוצאה היא מערכת שמבדילה בין פעילות גופנית לפתולוגיה עם דיוק זיהוי של עד 95%.
הנקודה אינה רק איסוף מספרים — אלא לגרום למודל לומר "משהו לא בסדר" לפני שהמשתמש מרגיש זאת. אנו מיישמים את המחזור המלא משילוב HealthKit ו-Health Connect ועד לפריסת מודלי ML על המכשיר. לצוות שלנו ניסיון של 10+ שנים בפיתוח אפליקציות רפואיות למובייל והוא מוסמך על ידי Apple ו-Google.
כיצד ניטור בריאות בינה מלאכותית חוזה חריגות?
אנו בונים מודלים מותאמים אישית על בסיס שילוב של HRV, דופק במנוחה, צעדים ואיכות שינה. המערכת לא רק מסמנת סטיות; היא מפרשת אותן בהקשר של אורח החיים של המשתמש. לדוגמה, דופק מוגבר במהלך פעילות גופנית הוא תקין, אך במנוחה הוא מאותת על צורך בבדיקה. באמצעות שימוש ב-Isolation Forest, הפחתנו תוצאות חיוביות שגויות ב-27% בפרויקט אחד. במבחני השוואה, Isolation Forest עולה על z-score בעד 40% בדיוק זיהוי לחריגות רב-משתניות.
מקורות נתוני חיישנים
iOS: HealthKit
HealthKit הוא הדרך התקינה היחידה להשיג נתוני בריאות ב-iOS. בקשות Bluetooth ישירות לחיישנים ללא HealthKit מפרות את הנחיות App Store. Apple ממליצה על HealthKit כמקור הנתונים המורשה היחיד לנתוני בריאות ב-iOS (תיעוד HealthKit ב-developer.apple.com/documentation/healthkit).
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)
}
}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 רגיל לוקח תמונת מצב ואינו מתעדכן.
Android: Health Connect + חיישנים ישירים
Health Connect (API 26+) הוא המקבילה האנדרואידית של HealthKit. הוא מאגד נתונים מ-Galaxy Health, Fitbit, Garmin. גישה ישירה לחיישנים דרך HKSampleQuery:
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)
}
}
}
}בדיקת דיוק היא חובה. SensorManager (0) נותן חפצים: לדוגמה, 255 פעימות לדקה על חיישן רטוב.
השוואה בין HealthKit ל-Health Connect
| פרמטר | HealthKit (iOS) | Health Connect (Android) |
|---|---|---|
| גישה | רק דרך ה-framework | API לחיישנים + מאגדים |
| עבודה ברקע | כן, דרך HKLiveWorkout | כן, דרך Foreground Service |
| פרטיות | הסכמה מפורשת לכל סוג | הרשאות זמן ריצה + הסכמה |
| נתונים נתמכים | דופק, SpO2, צעדים, HRV, שינה | דופק, SpO2, צעדים, פעילות, תזונה |
השוואת שיטות זיהוי חריגות
| שיטה | מורכבות | דיוק | יכולת פרשנות |
|---|---|---|---|
| Z-score | נמוכה | בינונית | גבוהה |
| Isolation Forest | בינונית | גבוהה | נמוכה |
ניתוח בינה מלאכותית: זיהוי חריגות
המטרה היא לזהות סטיות מהנורמות האישיות—לא נורמות רפואיות (זה לא מכשיר רפואי), אלא הנורמה עבור כל משתמש ספציפי.
Isolation Forest עובד היטב עבור סדרות זמן רב-משתניות עם מספר קטן של תכונות. אנו מאמנים על התנהגות "נורמלית" במשך 2–4 שבועות ומזהים חריגים. זה מומר ל-CoreML דרך 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) } } } } . ראו עוד על Isolation Forest ב-scikit-learn.org.
סטטיסטיקות נעות + 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 פעימות לדקה אחרי WorkoutStart ב-HealthKit הוא תקין; אותו ערך במנוחה הוא חריגה. אנו מוסיפים הקשר פעילות דרך CMMotionActivityManager (iOS) או ActivityRecognitionClient (Android).
בחירת השיטה תלויה בנפח הנתונים: עם נתונים היסטוריים של 2+ שבועות, Isolation Forest עדיף; אחרת, z-score להתחלה מהירה.
בפרויקט אחד, השתמשנו בחלון נע של 1000 ערכי דופק אחרונים עם חפיפה של 80%. אם z-score עלה על 3.5, המערכת שלחה התראת push. זה הפחית התראות שווא ב-27% בהשוואה לסף קבוע של 3.0. אנו מעבדים למעלה מ-1,000,000 רשומות חיישנים ביום, ומבטיחים ניטור רציף עם זמן עיבוד מתחת ל-100ms.
כיצד נוצרות המלצות מותאמות אישית?
בהתבסס על דפוסים מצטברים, אנו בונים מערכת המלצות. לא "תתאמן יותר" — אלא "ה-HRV שלך ירד ב-18% במשך 3 ימים, מה שלעתים קרובות מתאם לחוסר שינה — היום אימון קל עדיף."
ההמלצות מיושמות כמערכת מבוססת כללים על גבי ניתוח ML: ML מזהה את הדפוס, כללים הופכים אותו למסר ספציפי. מנוע כללים קל יותר לבדיקה ולוויסות מאשר קופסה שחורה. השקעה בפיתוח בדרך כלל מחזירה את עצמה תוך 6–9 חודשים בשל מעורבות משתמשים מוגברת. עלות הפיתוח מתחילה מ-$5,000 לפתרון בסיסי עם ניטור z-score ולוח מחוונים.
כיצד מובטחות פרטיות ורגולציה?
נתוני בריאות הם רגישים. GDPR וסקירת Apple דורשות הסכמה מפורשת לכל סוג נתונים. אחסון בצד השרת חייב להיות מוצפן (AES-256 במנוחה, TLS 1.3 בתעבורה). אנו מבטיחים עמידה בתקני Apple ו-Google, ומחזיקים באישורי אבטחה.
לפי תיעוד Apple, HealthKit הוא המקור המורשה היחיד לנתוני בריאות ב-iOS. אם האפליקציה ממוצבת כרפואית (אבחון, טיפול), היא זקוקה לאישור FDA 510(k) (ארה"ב) או סימון CE (האיחוד האירופי). עבור אפליקציות בריאות ללא טענות רפואיות, רגולציה זו אינה חלה—אך טקסט השיווק חייב לקחת זאת בחשבון.
מה כלול בעבודה?
- פיתוח צינור נתונים: מקורות HealthKit / Health Connect → נורמליזציה → אחסון.
- מודל זיהוי חריגות (z-score או Isolation Forest) מאומן על נתונים אישיים.
- מערכת המלצות מותאמת אישית עם מנוע כללים.
- רכיבי UI: לוח מחוונים בריאותי, גרפים אינטראקטיביים, התראות.
- שילוב מכשירים לבישים ובדיקות בתרחישים אמיתיים.
- תיעוד ארכיטקטורה והוראות תחזוקה.
- גישה למאגרי קוד וצינורות CI/CD.
- מפגש הדרכה לצוות הפיתוח שלך (עד 4 שעות).
- תמיכה לאחר השקה למשך 3 חודשים, כולל תיקוני באגים וכיוונון ביצועים.
כיצד ליישם ניטור בריאות בינה מלאכותית: תוכנית שלב-אחר-שלב
- קבע את רשימת החיישנים וסוגי הנתונים (דופק, SpO2, פעילות).
- שלב את HealthKit (iOS) ו-Health Connect (Android).
- פתח צינור לאיסוף נתונים ונורמליזציה.
- אמן מודל זיהוי על נתונים היסטוריים (2–4 שבועות).
- יישם UI עם לוח מחוונים והתראות.
- בדוק על מכשירים לבישים אמיתיים.
הערכות זמנים
ניטור בסיסי עם זיהוי z-score ולוח מחוונים: 2–3 שבועות. מערכת AI מלאה עם Isolation Forest, המלצות מותאמות אישית ועדכוני מודל ברקע: 4–8 שבועות. העלות מחושבת באופן פרטני לאחר ביקורת דרישות.
התחל עכשיו
אנו מציעים פיתוח מפתח-בשל של אפליקציות ניטור בריאות בינה מלאכותית למובייל במסגרת חוזה במחיר קבוע עם תקופת אחריות. צור קשר – נעריך את הפרויקט שלך ונספק הצעת מחיר מפורטת כולל לוח זמנים ועלות. כתוב לנו עוד היום.







