Messung und Instrumentierung
Verwenden der Ios Healthkit API zum Verfolgen und Anzeigen von Fitnessdaten
Table of Contents
Einführung in die HealthKit API von Apple
In einer Zeit, in der persönliche Gesundheitsdaten umsetzbare Erkenntnisse liefern, ist die iOS HealthKit API zu einem Eckpfeiler für Entwickler geworden, die Fitness- und Wellness-Anwendungen entwickeln. Dieses Framework, das von Apple mit iOS 8 eingeführt wurde, bietet ein einheitliches, sicheres Repository für Gesundheits- und Aktivitätsinformationen. Durch die Integration von HealthKit kann Ihre App aus dem Health App-Datenspeicher lesen und in diesen schreiben, sodass Benutzer eine konsolidierte Ansicht ihrer Schritte, Herzfrequenz, Schlafanalyse, Ernährungsprotokolle und sogar klinische Aufzeichnungen sehen können. Dieser Artikel untersucht, wie Sie die HealthKit API nutzen können, um Fitnessdaten effektiv zu verfolgen und anzuzeigen, einschließlich Berechtigungsworkflows, Abfragestrategien, Datenvisualisierung und Best Practices für die Produktion.
Die Architektur von HealthKit verstehen
HealthKit organisiert Daten um zwei primäre Konzepte: Datentypen und Datenobjekte. Datentypen definieren die Kategorie der Messung, wie oder . Datenobjekte sind die tatsächlichen Datensätze, die samples (eine einzelne Messung oder ein einzelnes Ereignis), (Gruppen verwandter Proben) oder workouts Der HealthKit-Store wird auf dem Gerät verschlüsselt und über die iCloud synchronisiert, aber nur, wenn der Benutzer die Gesundheitssynchronisierung explizit aktiviert. Jede Zugriffsanforderung muss vom Benutzer über einen Systemdialog autorisiert werden, um die Einhaltung der Datenschutzbestimmungen zu gewährleisten.
Schlüsselkomponenten
- HKHealthStore – Zentraler Zugangspunkt für alle HealthKit-Operationen.
- HKObjectType – Identifiziert eine Art von Gesundheitsdaten (Menge, Kategorie oder Eigenschaft).
- HKSampleQuery – Retrieves a fixed set of stored samples.
- HKStatisticsQuery – Berechnet aggregierte Werte (Summe, Durchschnitt, min, max, etc.) über ein Zeitintervall.
- HKObserverQuery – Überwacht Änderungen an bestimmten Datentypen, die Hintergrundaktualisierungen ermöglichen.
Berechtigungen einrichten – Zugriff anfordern
Vor jedem Datenaustausch muss Ihre App die Erlaubnis mit anfordern. Sie müssen sowohl Lese- als auch Schreibberechtigungen in Ihrem mit den und Tasten deklarieren. Für Fitness-Tracking lesen Sie normalerweise Schrittzahl, aktive Energie, Herzfrequenz und möglicherweise Workouts.
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
}
}
Behandeln Sie den Autorisierungs-Rückruf immer anmutig. Wenn der Benutzer dies ablehnt, vermeiden Sie die Blockierung der Funktionalität; erklären Sie stattdessen, warum die Daten benötigt werden, und geben Sie eine Alternative an (z. B. manuelle Eingabe).
Abfrage von Fitnessdaten
HealthKit bietet verschiedene Abfragetypen an, um Daten effizient abzurufen. Die gängigsten für Fitness-Apps sind Beispielabfragen und statistische Abfragen.
HKSampleQuery – Rohdaten abrufen
Verwenden Sie , wenn Sie individuelle Datensätze benötigen, wie die letzten 100 Herzfrequenzmessungen oder die heutigen Schrittprotokolle. Geben Sie ein Prädikat an, um nach Datum, Quelle oder Wert zu filtern. Begrenzen Sie für die Leistung immer die Anzahl der zurückgegebenen Ergebnisse.
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 – Aggregierte Daten
Für Summen, Mittelwerte oder Maximums über einen bestimmten Zeitraum (z. B. tägliche Schrittzahl) verwenden Sie Dies ist viel effizienter als die Summe einzelner Stichproben.
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 – Zeitreihendaten
Um ein Diagramm von Schritten pro Tag für die letzte Woche anzuzeigen, verwenden Sie Es werden Statistiken für jeden Tag zwischen einem Start- und Enddatum stapelt, was es ideal für Trends macht.
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)
Anzeige von Fitnessdaten
Rohe Zahlen sind ohne klare Visualisierung bedeutungslos. Eine gut gestaltete Benutzeroberfläche verwandelt HealthKit-Daten in motivierende Erkenntnisse. Betrachten Sie die folgenden Ansätze:
- Zusammenfassungskarten: Zeigen Sie die heutige Schrittzahl, aktive Minuten und den Herzfrequenztrend in einem kompakten Dashboard an.
- Charts: Verwenden Sie Linien- oder Balkendiagramme, um wöchentliche Schritte, monatliche aktive Energie oder Herzfrequenzzonen anzuzeigen. Bibliotheken wie Swift Charts (iOS 16+) oder Charts (DGCharts) integrieren sich nahtlos.
- Zielringe: Apples klassische Aktivitätsringe können emuliert werden, um Energie, Bewegung und Standzeiten zu visualisieren.
- Workout-Zusammenfassungen: Aktuelle Dauer, durchschnittliche Herzfrequenz, Distanz und Kalorien verbrannt für jedes protokollierte Training.
Beispiel: Aufbau eines Step Count Dashboards
Kombinieren Sie die Statistikabfrage oben mit SwiftUI, um einen Schrittzähler für die Live-Aktualisierung zu erstellen:
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
}
}
Echtzeit-Updates mit HKObserverQuery
Um Ihr Dashboard ohne manuelle Aktualisierung auf dem neuesten Stand zu halten, richten Sie ein ein.Das System benachrichtigt Ihre App, wenn neue Daten an HealthKit gespeichert werden (auch während die App im Hintergrund gespeichert ist, wenn Sie sich für die Hintergrundbereitstellung registrieren).
let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
DispatchQueue.main.async { self.fetchTodaySteps() }
completionHandler()
}
healthStore.execute(observerQuery)
Für Hintergrund-Updates müssen Sie auch aufrufen. beachten Sie, dass iOS Hintergrund-Callbacks drosselt, um den Akku zu erhalten; verwenden Sie dies sparsam und behandeln Sie immer den Abschluss-Handler.
Best Practices für Privatsphäre und Sicherheit
Gesundheitsdaten sind sensibel. Apple erzwingt strenge Regeln, und die Nichteinhaltung kann zu einer Ablehnung des App Store führen.
- Minimaldatenanforderungen: Fordern Sie nur die Datentypen an, die Ihre App tatsächlich verwendet.
- Klare Erklärungszeichenfolgen: Die Nutzungsbeschreibung in Info.plist sollte spezifisch sein, z.B. "Diese App liest Ihre Schrittzahl, um Ihre tägliche Aktivität anzuzeigen."
- Teilen Sie niemals rohe HealthKit-Daten ohne ausdrückliche Benutzerzustimmung außerhalb des Geräts.
- Respektieren Sie die Autorisierungsänderungen: Beobachten Sie, wenn der Benutzer Berechtigungen durch oder durch Überprüfung des Autorisierungsstatus vor jeder Abfrage widerruft.
- Verwalte Fehler anmutig: HealthKit-Abfragen können aufgrund von Autorisierung, fehlenden Daten oder Datenbankfehlern fehlschlagen. Zeigen Sie immer eine benutzerfreundliche Nachricht an.
Integration mit Apple Watch und anderen Quellen
HealthKit aggregiert automatisch Daten von Apple Watch, Apps von Drittanbietern und manuelle Einträge. Ihre iOS-App muss die Quelle nicht unterscheiden, es sei denn, Sie möchten speziell nach Quelle filtern. Für Workout-Apps sollten Sie Objekte in HealthKit schreiben. Wenn ein Benutzer ein Workout auf Apple Watch startet, kann das System automatisch Metriken aufzeichnen; Ihre Begleiter-App kann diese später lesen.
Um Workout-Daten zu schreiben:
let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
// Handle
}
Sie können auch zugehörige Proben (z. B. Herzfrequenz, Route) zum Training mit und hinzufügen.
Häufige Fallstricke und wie man sie vermeidet
- Angenommen, Daten sind immer verfügbar: Ein neuer Benutzer hat möglicherweise keine HealthKit-Daten. Entwerfen Sie Ihre Benutzeroberfläche so, dass Platzhalter angezeigt werden, oder ermutigen Sie den Benutzer, mit dem Tracking über die Health-App oder die Apple Watch zu beginnen.
- Zu viele Daten auf einmal abfragen: Große Abfragen (z.B. alle Samples für das vergangene Jahr) können langsam sein und im Speicher abstürzen.
- Zeitzonen ignorieren: HealthKit-Zeitstempel sind in UTC. Wenn Sie nach Tag gruppieren, konvertieren Sie in die lokale Zeitzone des Benutzers, um Fehlausrichtungen zu vermeiden.
- Blockieren des Hauptthreads: HealthKit-Abfragen sind asynchron, aber ihre Abschluss-Handler laufen möglicherweise nicht im Hauptthread.
- Vergessen, die Verfügbarkeit von Gesundheitsdaten zu überprüfen: HealthKit ist auf iPad und iPod touch nicht verfügbar. Rufen Sie immer an, bevor Sie interagieren.
Erweiterung mit Gesundheitsakten und klinischen Daten
Für Apps, die sich auf klinische Gesundheit konzentrieren, unterstützt HealthKit auch Health Records (über FHIR). Mit Benutzererlaubnis kann Ihre App auf Impfungen, Laborergebnisse, Medikamente und Bedingungen zugreifen. Dies eröffnet Möglichkeiten für Medikamententracker, Allergie-Checker oder chronisches Zustandsmanagement. Diese Datentypen erfordern jedoch eine zusätzliche Überprüfung für die Health Records Berechtigung von Apple.
Schlussfolgerung
Die iOS HealthKit API bietet eine robuste, datenschutzorientierte Grundlage für die Verfolgung und Anzeige von Fitnessdaten. Durch das Verständnis des Berechtigungsmodells, der Abfragetypen und der Best Practices können Sie eine App erstellen, die sich nahtlos in das Gesundheitsökosystem des Benutzers integriert. Beginnen Sie mit einfachen Schritt- und Herzfrequenzabfragen und integrieren Sie dann schrittweise erweiterte Funktionen wie Hintergrundaktualisierungen, Konnektivität und klinische Aufzeichnungen. Das Ergebnis ist ein leistungsstarkes Tool, das nicht nur die Benutzer über ihre Gesundheit informiert, sondern sie auch motiviert, ihre Fitnessziele zu erreichen.
Für weitere Informationen lesen Sie die offizielle Apple HealthKit Dokumentation , die HealthKit Human Interface Guidelines und Community-Ressourcen wie Ray Wenderlichs HealthKit Tutorial für praktische Code-Beispiele.