ה-API של Apple

בעידן שבו נתונים אישיים לבריאות מניעים תובנות ניתנות לפעולה, ה- iOS HealthKit API הפך אבן הפינה עבור מפתחים לבניית כושר ויישומים בריאותיים.מסגרת זו, שהוצגה על ידי Apple עם iOS 8, מספקת מאגר חד-משמעי של מידע לבריאות ולפעילות.על ידי שילוב של HealthKit, האפליקציה שלך יכולה לקרוא ולכתוב לאחסון נתוני אפליקציית הבריאות, ומאפשרת למשתמשים לראות תצוגה מאוחדת של השלבים, קצב הלב, ניתוח תזונתי, אפילו כדי להציג את הרשומות התפעוליות הטובות ביותר, ולת, כדי להציג ביעילות, כדי להציג את הנתונים החזותיים, ולת, ולת, ולת, כדי להציג את ה- API, כדי להציג את ה- API, כדי להציג את ה- API, כדי להציג את ה- API, כדי להציג את ה- API, כדי להציג את ה- API ביעילות, כדי להציג את ה- API, כדי להציג את ה- API, כדי להציג את ה- API, ביעילות, כדי להציג את ה- API, כדי להציג את ה- API, ביעילות, כדי להציג את ה- API, כדי להציג את ה- API, כדי להציג את ה- API, ביעילות, כדי להציג את ה- API, כדי להציג את ה- API של שיטות העבודה, כדי להציג את ה- API, כדי להציג את ה- API

הבנת הארכיטקטורה של HealthKit

(ה) מארגנת נתונים סביב שני מושגים עיקריים: FLT:0datatype TypesFLT:1 ו-FLT:2data Objects FLT 3: Data Types מגדיר את הקטגוריה של המדידה, כגון FLT:0 או (FLT:1 אובייקטים נתונים) הם רשומות הפרטיות של המשתמש, אשר ניתן לסנכרן רק על ידי ספירת נתונים הקשורים ל-iPoLT:4sFLT5 (מדידציה יחידה או אירוע יחיד), אך ורק על ידי LT)

המונחים: key Components

  • (ב) [15] ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) [ה]ה'ובא"ל: [ה'], [ה'], [ה'], [ה'], כ'[ה], כ'[ה], או'[ה]']
  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) [ה]ה-[ה], [ה], [ה],] [ה], [ה],] [ה], [ה],]], [ה],]], [ה], [ה],], [ה], [ה],], [ה], [ה],], [ה],], [ה], [התחילה], [ה], [ה], [ה], [ה], [ה], [ה],], [ה], [ה], [ה],],], [ה], [ה], [ה'], [ה'], [ה'], [ה'], [ה'], [ה'], [ה'], [ה'], [ה'], [ה'], [ה'],],], [ה'], [ה'], [ה'],],], [ה'], [ה'],], [ה'],], [ה'],],], [ה'],
  • (FLT:0)HKObserverQueryFIRLT:1) - מעקבים לשינויים בסוגי נתונים מוגדרים, המאפשרים עדכוני רקע.

קביעת הרשאות - בקשה לגישה

לפני כל חילופי נתונים, האפליקציה שלך חייבת לבקש רשות באמצעות FLT:2 עליך להכריז הן על קריאה והן לכתוב הרשאות ב-FLT 3: עם FLT:4 ו-FLT:5 מפתחות.

import HealthKit

let healthStore = HKHealthStore()

func requestHealthPermissions() {
 guard HKHealthStore.isHealthDataAvailable() else { return }
 let readTypes: Set<HKObjectType> = [
 HKObjectType.quantityType(forIdentifier: .stepCount)!,
 HKObjectType.quantityType(forIdentifier: .heartRate)!,
 HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
 HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
 ]
 let writeTypes: Set<HKSampleType> = [
 HKObjectType.workoutType()
 ]
 healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { success, error in
 // Handle response
 }
}

תמיד לטפל באישור להתקשר בחסד.אם המשתמש יורד, להימנע מחסימת פונקציונליות; במקום זאת, להסביר מדוע הנתונים נדרשים ולספק חלופה (למשל, כניסה ידנית) לזכור כי הרשאות ניתן לשנות מאוחר יותר בכרטיסיה מקורות הבריאות.

עקבו אחרי Fitness Data

HealthKit מציע מספר סוגי שאילתה כדי להביא נתונים ביעילות.הנפוצים ביותר עבור יישומי כושר הם שאילתות דגימות ושאילתות סטטיסטיות.

HKSampleQuery - Retrieving Raw Data

השתמש ב-FLT:7 כאשר אתה צריך רשומות בודדות, כמו 100 פעימות לב האחרון או יומני הצעד של היום. ציין מרשם מסונן עד תאריך, מקור או ערך.

let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)

let query = HKSampleQuery(sampleType: stepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { query, samples, error in
 guard let samples = samples as? [HKQuantitySample] else { return }
 // Process samples
}
healthStore.execute(query)

HKStatisticsQuery - Aggregated Data

עבור סך הכל, ממוצעים או מקסימום לאורך תקופה מסוימת (למשל ספירת צעד יומי), השתמש בספירת צעד יומי (FLT:9 ).

let statisticsQuery = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { query, result, error in
 let sum = result?.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Update UI with total steps
}
healthStore.execute(statisticsQuery)

HKStatisticsCollectionQuery - Time-Series Data

כדי להציג תרשים של צעדים ליום בשבוע האחרון, השתמש בנתוני FLT:11 לכל יום בין תאריך התחלה וסוף, מה שהופך אותו אידיאלי עבור מגמות.

let now = Date()
let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: now)!
let anchorDate = Calendar.current.startOfDay(for: now)
let daily = DateComponents(day: 1)

let collectionQuery = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)
collectionQuery.initialResultsHandler = { query, results, error in
 results?.enumerateStatistics(from: sevenDaysAgo, to: now) { statistics, stop in
 let steps = statistics.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Append steps for statistics.startDate
 }
}
healthStore.execute(collectionQuery)

הצגת נתוני הכושר

מספרי Raw הם חסרי משמעות ללא ויזואליזציה ברורה.UI מתוכנן היטב משנה את נתוני הבריאות לתובנות מוטיבציה.חשב את הגישות הבאות:

  • (ב) ,0) כרטיסי טיסה: FLT:1show של היום, ספירת צעד, דקות פעילות ומגמה קצב הלב בלוחם קומפקטי.
  • (ב) ⁇ (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • טבעות:0 (Goal Rings: FLT:1) ניתן לחקות טבעות פעילות קלאסית של אפל כדי לדמיין אנרגיה, פעילות גופנית, שעות עמידה.
  • (ב) ,0) עבדול סאממים: משך ה-IIFLT:1rea, קצב הלב הממוצע, המרחק והקלוריות נשרף עבור כל אימון מחובר.

דוגמה: בניית לוח הבקרה של ה-Daw Step Count

לשלב את השאילתה הסטטיסטית לעיל עם SwiftUI כדי ליצור דלפק צעד חי:

struct StepCardView: View {
 @State private var steps: Double = 0

 var body: some View {
 VStack {
 Text("Steps")
 .font(.headline)
 Text("\(Int(steps))")
 .font(.largeTitle)
 .bold()
 }
 .onAppear { fetchTodaySteps() }
 }

 func fetchTodaySteps() {
 // Use HKStatisticsQuery as shown earlier
 }
}

עדכון בזמן אמת עם HKObserverQuery

כדי לשמור על לוח המחוונים שלך הנוכחי ללא רענון ידני, להגדיר מערכת 14.14.המערכת מאשרת את האפליקציה שלך כאשר נתונים חדשים נשמרים לבריאות (אפילו בזמן שהאפליקציית מבוססת, אם אתה נרשם למשלוח רקע).

let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
 DispatchQueue.main.async { self.fetchTodaySteps() }
 completionHandler()
}
healthStore.execute(observerQuery)

עבור עדכוני רקע, עליך לקרוא גם ל-FLT:16 [הערה: iOS מצלם רקע כדי לשמר סוללות; להשתמש בספאם זה תמיד לטפל מטפל ההשלמה.

הפרקטיקה הטובה ביותר לפרטיות ואבטחה

נתוני בריאות רגישים.אפל לאכוף כללים נוקשים, ולא לציית יכולים להוביל לדחיית App Store.

  • (FLT:0) בקשות נתונים מינימליות: FLT:1 רק לבקש את סוגי הנתונים שהאפליקציית שלך משתמשת בהם, להימנע מלבקש "רשומות בריאות" אם רק צריך ספירת צעד.
  • (ב) ⁇ :0) הסבר מחרוזת: FLT:1, תיאור השימוש ב- Info.plist צריך להיות ספציפי, למשל, "ה אפליקציה זו קוראת את ספירת השלבים שלך כדי להראות את הפעילות היומיומית שלך".
  • (FLT:0) לעולם אל תשתף נתונים של בריאות גולמית מ-deviceFLT ( 1:1 ללא הסכמת משתמשים מפורשת.אם לסנכרן לגיבוי שלך, אנונימיות וצפיפות נתונים.
  • (ב) עיין ב[[1724]], [[1924]], כאשר [[המאה ה-17]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]]
  • (FLT:0) שגיאות ההנדלה בחסד: שאילתות בריאות 1 (בריאות) עלולות להיכשל בשל אישור, חוסר נתונים או שגיאות מסד נתונים.תמיד להציג הודעה ידידותית למשתמש.

היכרות עם Apple Watch ומקורות אחרים

HealthKit באופן אוטומטי מצטבר נתונים מ-Apple Watch, אפליקציות צד שלישי וערכי ידניות.אפליקציית iOS שלך אינה צריכה להבחין במקור אלא אם כן ברצונך באופן ספציפי לסנן באמצעות מקור. for Training, שקול לכתוב FLT 18 אובייקטים לבריאות.כאשר משתמש מתחיל אימון ב-Apple Watch, המערכת יכולה לרשום באופן אוטומטי מדדים; אפליקציית ה- iOS שלך יכולה לקרוא מאוחר יותר.

לכתוב נתוני אימון:

let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
 // Handle
}

ניתן להוסיף דגימות הקשורות (למשל, קצב לב, מסלול) לאימון באמצעות (FLT:20 ו-FLT:21).

מלכודות נפוצות וכיצד להימנע מהם

  • (FLT:0) איסוף נתונים זמין תמיד: ההרחבה 1 (משתמש חדש לא יכול להיות נתונים של HealthKit.עיצוב UI שלך כדי להציג בעלי אתרים או לעודד את המשתמש להתחיל לעקוב באמצעות אפליקציית הבריאות או Apple Watch.
  • (FLT:0)Querying יותר מדי נתונים בבת אחת: ibph:1 שאילתות גדולות (למשל, כל הדגימות לשנה האחרונה) יכולות להיות איטיות והתנגשות בזיכרון. השתמש בהפרעות תאריך ודמיון עם מגבלות.
  • אזורי זמן:0 (Ignoing time Zone:FLT:1 HealthKitamps) הם ב- UTC.כאשר הם מקובצים עד היום, הופכים לאזור הזמן המקומי של המשתמש כדי למנוע אי-השמדה.
  • (ב) ⁇ :0) ביטול החוט הראשי: שאילתות בריאות (בריאות) 1 (בריאות) הן מסונכרנות, אך המטפלים שלהם אינם יכולים להפעיל על חוט הראשי.
  • (הרחבה:0) כדי לבדוק את זמינות הנתונים של בריאות: ההרחבה 1 (בריאות LT:1) אינה זמינה ב-iPad ו-iPod touch. Always CallFLT:23 לפני כל אינטראקציה.

הרחבת רשומות הבריאות והנתונים הקליניים

עבור יישומים המתמקדים בבריאות קלינית, HealthKit תומך גם ב-FLT:0Health RecordsFLT:1 (באמצעות FHIR) עם אישור משתמש, האפליקציה שלך יכולה לגשת לחיסונים, תוצאות מעבדה, תרופות, תנאים.זה פותח אפשרויות עבור תרופות מעקבים, בדיקת אלרגיה, או ניהול מצב כרוני.

מסקנה

ה- iOS HealthKit API מציע בסיס חזק, ממוקד פרטיות למעקב ולהצגת נתוני כושר.על ידי הבנת מודל הרשאות שלו, סוגי שאילתה ושיטות הטובות ביותר, אתה יכול לבנות אפליקציה שמשתלבת בצורה חלקה עם מערכת הבריאות של המשתמש.התחל עם שאילתות שלב פשוטות וקצב לב, ולאחר מכן לשלב בהדרגה תכונות מתקדמות יותר כמו עדכוני רקע, צפייה בלינקות, ורשומות קליניות.

(ב) לעיין ב[[המאה ה-20]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]], [[1924]]