Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Apple Health (HealthKit) से FHIR
Swift में HealthKit के साथ Apple Watch और Apple Health डेटा पढ़ें, स्थानीय दिन के अनुसार, और इसे FHIR R4 रिकॉर्ड में लिखें: अनुमतियाँ, बैकग्राउंड सिंक, Apple के नियम।
Apple Watch डेटा युग्मित iPhone पर Apple Health में रहता है, और इसे पढ़ने का एकमात्र तरीका HealthKit है, उस iPhone पर एक ऐप से, व्यक्ति की अनुमति के साथ। इसे FHIR रिकॉर्ड में डालने के लिए, HKStatisticsCollectionQuery के साथ दैनिक आँकड़े पढ़ें, मानों को अपने बैकएंड पर भेजें, और प्रत्येक मीट्रिक को LOINC कोड और UCUM इकाई के साथ एक Observation के रूप में लिखें। यह पृष्ठ Swift कोड (iOS 17 SDK के विरुद्ध टाइप-चेक किया गया), Apple द्वारा निर्धारित अनुमतियाँ और नियम, और मान FHIR R4 Observations कैसे बनते हैं, दिखाता है।
Apple Health में क्या है
Apple Health वह सब कुछ इकट्ठा करता है जो iPhone और Apple Watch मापते हैं — हृदय गति, आराम की हृदय गति, हृदय गति परिवर्तनशीलता (SDNN), रक्त ऑक्सीजन, श्वसन दर, कदम, ऊर्जा, नींद के चरण, अनियमित लय सूचनाएं, ECG रिकॉर्डिंग — और जो अन्य ऐप्स लिखते हैं: Garmin Connect, Oura, Withings Health Mate, स्मार्ट स्केल, रक्तचाप मॉनिटर, ग्लूकोज मीटर। इसलिए Apple Health को पढ़ना Apple Watch से कहीं अधिक को कवर करता है।
कोई HealthKit सर्वर या वेब API नहीं है। डेटा डिवाइस पर रहता है (और व्यक्ति के एन्क्रिप्टेड iCloud बैकअप में); आपका ऐप इसे स्थानीय रूप से पढ़ता है।
अनुमतियाँ
- Xcode में HealthKit क्षमता चालू करें और
NSHealthShareUsageDescriptionकोInfo.plistमें जोड़ें (यदि आप लिखते हैं तोNSHealthUpdateUsageDescriptionभी जोड़ें)। - आपको जिन प्रकारों की आवश्यकता है, उनके लिए पूछें। लोग कुछ को अनुमति दे सकते हैं और दूसरों को मना कर सकते हैं, और HealthKit आपके ऐप को यह नहीं बताता है कि रीड एक्सेस को मना किया गया था या नहीं: मना किया गया प्रकार बस कोई डेटा वापस नहीं करता है। त्रुटि के बजाय "कोई डेटा नहीं" के लिए स्क्रीन डिज़ाइन करें।
- व्यक्ति के कनेक्ट होने के क्षण में पूछें, कारण बताते हुए एक वाक्य के साथ, पहली बार लॉन्च होने पर नहीं।
Swift में दैनिक मान पढ़ना
import Foundation
import HealthKit
/// One day of Apple Health data, ready to send to your backend.
struct DailyValue: Codable {
let metric: String // "heart_rate", "steps"
let day: String // "2026-10-01", the user's local day
let value: Double
let min: Double?
let max: Double?
}
let store = HKHealthStore()
let heartRate = HKQuantityType(.heartRate)
let steps = HKQuantityType(.stepCount)
func requestAccess() async throws {
// Read-only: the app never writes to Apple Health.
try await store.requestAuthorization(toShare: [], read: [heartRate, steps])
}
/// Daily statistics for the last `days` days, one value per local calendar day.
func dailyValues(_ type: HKQuantityType, metric: String, unit: HKUnit,
options: HKStatisticsOptions, days: Int) async throws -> [DailyValue] {
let calendar = Calendar.current
let end = calendar.startOfDay(for: Date()).addingTimeInterval(86_400)
let start = calendar.date(byAdding: .day, value: -days, to: end)!
let query = HKStatisticsCollectionQueryDescriptor(
predicate: HKSamplePredicate.quantitySample(type: type,
predicate: HKQuery.predicateForSamples(withStart: start, end: end)),
options: options,
anchorDate: start,
intervalComponents: DateComponents(day: 1))
let collection = try await query.result(for: store)
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
var out: [DailyValue] = []
collection.enumerateStatistics(from: start, to: end) { stats, _ in
let day = fmt.string(from: stats.startDate)
if options.contains(.cumulativeSum), let sum = stats.sumQuantity() {
out.append(DailyValue(metric: metric, day: day, value: sum.doubleValue(for: unit), min: nil, max: nil))
} else if let avg = stats.averageQuantity() {
out.append(DailyValue(metric: metric, day: day, value: avg.doubleValue(for: unit),
min: stats.minimumQuantity()?.doubleValue(for: unit),
max: stats.maximumQuantity()?.doubleValue(for: unit)))
}
}
return out
}
func collect() async throws -> [DailyValue] {
try await requestAccess()
let bpm = HKUnit.count().unitDivided(by: .minute())
let hr = try await dailyValues(heartRate, metric: "heart_rate", unit: bpm,
options: [.discreteAverage, .discreteMin, .discreteMax], days: 30)
let st = try await dailyValues(steps, metric: "steps", unit: .count(), options: .cumulativeSum, days: 30)
return hr + st // POST these to your backend, which writes them to the FHIR record
}
सैंपल पढ़ने के बजाय आँकड़े क्वेरी क्यों करें: HKStatisticsCollectionQuery प्रति-दिन कुल और औसत लौटाता है जो Apple Health ने पहले ही स्रोतों से डी-डुप्लिकेट कर दिए हैं, इसलिए iPhone और Watch दोनों द्वारा गिने गए कदम दो बार नहीं जोड़े जाते हैं। कच्चे सैंपल पढ़ना और उन्हें स्वयं जोड़ना, स्टेप काउंट में वृद्धि का सबसे आम स्रोत है।
दिन व्यक्ति के स्थानीय कैलेंडर दिन होते हैं (Calendar.current)। उन्हें FHIR रिकॉर्ड तक उसी तरह रखें, जहाँ Observation का effectivePeriod उस स्थानीय दिन को उसके टाइम-ज़ोन ऑफ़सेट के साथ दर्शाता है।
रिकॉर्ड को अपडेट रखना
- खुलने पर: हर बार जब ऐप फोरग्राउंड में आता है, तो पिछली सफल सिंक के बाद से दिनों की संख्या पढ़ें। यह विश्वसनीय आधार रेखा है।
- बैकग्राउंड में:
HKObserverQueryके साथenableBackgroundDelivery(for:frequency:)नया डेटा आने पर आपके ऐप को जगाता है; इसके लिए HealthKit बैकग्राउंड डिलीवरी एंटाइटलमेंट की आवश्यकता होती है, और iOS वास्तविक समय तय करता है। - पहला कनेक्शन: वर्षों के बजाय सीमित इतिहास (उदाहरण के लिए 30 दिन) आयात करें, फिर आगे बढ़ें।
स्विफ्ट मानों से FHIR अवलोकन तक
DailyValue ऐरे को अपने बैकएंड पर भेजें और प्रति व्यक्ति, प्रति मीट्रिक और प्रति दिन एक अवलोकन लिखें, जिसमें एक स्थिर पहचानकर्ता हो, और जब वही दिन फिर से आए तो उसे अपडेट करें। मैपिंग तालिका (HealthKit प्रकार → LOINC → UCUM), एक मान्य JSON उदाहरण और TypeScript कोड जो इस अप्सर्ट को करता है, प्लेटफ़ॉर्म के विरुद्ध चलता है, FHIR में पहनने योग्य डेटा पर उपलब्ध है। यहाँ दो मेट्रिक्स के लिए कोड हैं:
| HealthKit | LOINC | UCUM | प्रति दिन मान |
|---|---|---|---|
heartRate |
8867-4 Heart rate | /min |
औसत, न्यूनतम और अधिकतम घटकों के रूप में |
stepCount |
41950-7 Number of steps in 24 hour | {steps} |
कुल |
स्वास्थ्य डेटा के लिए Apple के नियम
- ऐप समीक्षा दिशानिर्देश 5.1.3: स्वास्थ्य डेटा का उपयोग विज्ञापन या डेटा माइनिंग के लिए नहीं किया जा सकता है, व्यक्ति की सहमति के बिना तीसरे पक्ष के साथ साझा नहीं किया जा सकता है, और व्यक्तिगत स्वास्थ्य जानकारी iCloud में संग्रहीत नहीं की जा सकती है।
- आपकी गोपनीयता नीति में यह बताना होगा कि आप क्या पढ़ते हैं और क्यों; Apple इसकी जाँच करता है।
- आपके ऐप द्वारा Apple Health में लिखा गया डेटा आपके ऐप को एट्रीब्यूट किया जाता है; आपके द्वारा पढ़ा गया डेटा अपने मूल स्रोत (
HKSource) को बनाए रखता है, जिसे आपको स्रोत सिस्टम के रूप में रिकॉर्ड में ले जाना चाहिए।
Apple Health Records
फिटनेस डेटा से अलग, Apple Health स्वास्थ्य प्रणालियों (मुख्य रूप से संयुक्त राज्य अमेरिका में) से डाउनलोड किए गए नैदानिक रिकॉर्ड रख सकता है, और HealthKit उन्हें HKClinicalRecord ऑब्जेक्ट के रूप में उजागर करता है जो मूल FHIR संसाधन को ले जाते हैं। उन्हें पढ़ने के लिए अपनी अनुमति और पात्रता की आवश्यकता होती है। वे पहनने योग्य डेटा से एक अलग एकीकरण हैं, और Anpheros Daily आज उन्हें नहीं पढ़ता है।
Anpheros कहाँ फिट बैठता है
Anpheros Platform परिणाम संग्रहीत करता है: व्यक्ति का FHIR R4 रिकॉर्ड, जिसमें प्रत्येक पहनने योग्य मान को एक Observation के रूप में चिह्नित किया गया है, जिसे डिवाइस डेटा, अन्य ऐप्स के लिए सहमति, प्रोवेनेंस और एक एक्सेस लॉग के रूप में चिह्नित किया गया है। यह स्वयं Apple Health को नहीं पढ़ता है - वह आपके iOS ऐप में होता है। Anpheros का अपना ऐप, Anpheros Daily, iPhone (Plus और Max प्लान) पर Apple Health को पढ़ता है और उपरोक्त कोड के साथ रिकॉर्ड में दैनिक सारांश लिखता है।
अक्सर पूछे जाने वाले प्रश्न
क्या मैं सर्वर से Apple Watch डेटा पढ़ सकता हूँ?
नहीं। Apple Watch डेटा युग्मित iPhone पर Apple Health में सिंक्रनाइज़ होता है, और HealthKit का उपयोग केवल उस डिवाइस पर किसी ऐप द्वारा ही किया जा सकता है। ऐप डेटा पढ़ता है और उसे आपके सर्वर पर भेजता है।
क्या कोई Apple Health वेब API या REST API है?
नहीं। Apple Apple Health के लिए कोई वेब या REST API प्रदान नहीं करता है: HealthKit केवल व्यक्ति के iPhone (या Apple Watch) पर किसी ऐप के अंदर चलता है। सर्वर पर डेटा का उपयोग करने के लिए, आपका ऐप व्यक्ति की अनुमति से उसे पढ़ता है और उसे भेजता है, उदाहरण के लिए Anpheros को FHIR Observations के रूप में।
क्या मुझे Apple Health API के लिए API कुंजी की आवश्यकता है या भुगतान करना होगा?
कोई कुंजी नहीं और कोई शुल्क नहीं: HealthKit iOS का हिस्सा है। आपको अपने ऐप में HealthKit क्षमता, प्रत्येक डेटा प्रकार के लिए उपयोग विवरण और व्यक्ति की अनुमति की आवश्यकता है; App Store समीक्षा जांचती है कि आप डेटा का उपयोग कैसे करते हैं।
मुझे कैसे पता चलेगा कि व्यक्ति ने HealthKit प्रकार तक पहुँच से इनकार कर दिया है?
आप नहीं जान सकते, पढ़ने की पहुँच के लिए: HealthKit गोपनीयता की रक्षा के लिए इसे छुपाता है, और अस्वीकृत प्रकार कोई डेटा वापस नहीं करता है। "कोई डेटा नहीं" को एक सामान्य स्थिति के रूप में मानें और Health ऐप में अनुमतियों की समीक्षा करने का एक तरीका प्रदान करें।
मेरे स्टेप काउंट Health ऐप की तुलना में अधिक क्यों हैं?
आप शायद कई स्रोतों (iPhone और Watch) से कच्चे नमूने जोड़ रहे हैं। HKStatisticsCollectionQuery का उपयोग .cumulativeSum के साथ करें, जो Apple Health के स्वयं के डी-डुप्लीकेशन को लागू करता है।
Apple Watch हृदय गति परिवर्तनशीलता के लिए कौन सा LOINC कोड है?
Apple Health HRV को SDNN के रूप में संग्रहीत करता है, जो LOINC 80404-7 से मेल खाता है। Health Connect RMSSD को संग्रहीत करता है, जो एक अलग आँकड़ा है, इसलिए दोनों को एक कोड के तहत न मिलाएं।
संबंधित
- FHIR में वियरेबल डेटा: मैपिंग टेबल और बैकएंड कोड
- Health Connect से FHIR: Android पर भी यही
- पर्सनल हेल्थ रिकॉर्ड ऐप कैसे बनाएं
- Flutter के साथ हेल्थकेयर ऐप कैसे बनाएं
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card