# Apple Health (HealthKit) ile FHIR'a Veri Aktarımı

> Swift ile Apple Watch ve Apple Health verilerini HealthKit kullanarak, yerel gün bazında okuyun ve FHIR R4 kaydına yazın: izinler, arka plan senkronizasyonu, Apple'ın kuralları.

Source: https://developers.anpheros.com/tr/guides/apple-health-fhir

**Apple Watch verileri eşleştirilmiş iPhone'daki Apple Health'te bulunur ve bu verileri okumanın tek yolu, kişinin izniyle o iPhone'daki bir uygulamadan HealthKit kullanmaktır.** Bunu bir FHIR kaydına aktarmak için, günlük istatistikleri `HKStatisticsCollectionQuery` ile okuyun, değerleri arka ucunuza gönderin ve her metriği bir LOINC kodu ve bir UCUM birimi ile Observation olarak yazın. Bu sayfa, Swift kodunu (iOS 17 SDK'ya karşı tür denetimli), Apple'ın belirlediği izinleri ve kuralları ve değerlerin FHIR R4 Observation'larına nasıl dönüştüğünü gösterir.

## Apple Health'te Neler Var

Apple Health, iPhone ve Apple Watch'un ölçtüğü verileri — kalp atış hızı, dinlenme kalp atış hızı, kalp atış hızı değişkenliği (SDNN), kan oksijen seviyesi, solunum hızı, adımlar, enerji, uyku evreleri, düzensiz ritim bildirimleri, EKG kayıtları — ve diğer uygulamaların yazdığı verileri toplar: Garmin Connect, Oura, Withings Health Mate, akıllı tartılar, tansiyon aletleri, glikoz ölçüm cihazları. Bu nedenle Apple Health'i okumak, Apple Watch'tan daha fazlasını kapsar.

Bir HealthKit sunucusu veya web API'si yoktur. Veriler cihazda kalır (ve kişinin şifrelenmiş iCloud yedeğinde); uygulamanız verileri yerel olarak okur.

## İzinler

1. Xcode'da **HealthKit** özelliğini etkinleştirin ve `NSHealthShareUsageDescription`'ü `Info.plist`'e (yalnızca yazıyorsanız `NSHealthUpdateUsageDescription`'i de ekleyin) ekleyin.
2. İhtiyacınız olan türler için izin isteyin. Kullanıcılar bazılarına izin verebilir ve diğerlerini reddedebilir. **HealthKit, uygulamanıza okuma erişiminin reddedilip reddedilmediğini bildirmez**: reddedilen bir tür yalnızca veri döndürmez. Hata yerine "veri yok" senaryoları için ekranlar tasarlayın.
3. Kullanıcı bağlandığı anda, ilk başlatmada değil, nedenini açıklayan bir cümleyle izin isteyin.

## Swift'te Günlük Değerleri Okuma

```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
}
```

Örnekleri okumak yerine istatistik sorguları neden kullanılır: `HKStatisticsCollectionQuery`, Apple Health'in kaynaklar arasında zaten tekilleştirdiği günde bir toplam ve ortalamaları döndürür, böylece hem iPhone hem de Watch tarafından sayılan adımlar iki kez eklenmez. Ham örnekleri okuyup kendiniz toplamak, şişirilmiş adım sayılarının en yaygın kaynağıdır.

Günler, kişinin yerel takvim günleridir (`Calendar.current`). Bunları FHIR kaydına kadar bu şekilde tutun; burada Observation'ın `effectivePeriod`'i, saat dilimi ofsetiyle birlikte o yerel gündür.

## Kaydı Güncel Tutma

- **Açılışta:** Uygulama ön plana her geldiğinde, son başarılı senkronizasyondan bu yana geçen günleri okuyun. Bu güvenilir bir temeldir.
- **Arka planda:** Yeni veri geldiğinde uygulamanızı uyandırmak için `HKObserverQuery` ile `enableBackgroundDelivery(for:frequency:)` kullanın; bu, HealthKit arka plan teslim etme yetkisini gerektirir ve iOS gerçek zamanlamayı belirler.
- **İlk bağlantı:** Yıllar yerine sınırlı bir geçmişi (örneğin 30 gün) içe aktarın, ardından ilerleyin.

## Swift Değerlerinden FHIR Gözlemlerine

`DailyValue` dizisini arka ucunuza gönderin ve her kişi, metrik ve gün için sabit bir tanımlayıcı ile bir Gözlem yazın, aynı gün tekrar geldiğinde güncelleyin. Eşleme tablosu (HealthKit türü → LOINC → UCUM), doğrulanmış bir JSON örneği ve bu upsert işlemini gerçekleştiren, platforma karşı çalışan TypeScript kodu [FHIR'de Giyilebilir Veriler](https://developers.anpheros.com/tr/guides/wearable-data-fhir) bölümünde yer almaktadır. Buradaki iki metrik için kodlar şunlardır:

| HealthKit | LOINC | UCUM | Günlük Değer |
|---|---|---|---|
| `heartRate` | 8867-4 Heart rate | `/min` | ortalama, minimum ve maksimum bileşenler olarak |
| `stepCount` | 41950-7 Number of steps in 24 hour | `{steps}` | toplam |

## Apple'ın sağlık verileriyle ilgili kuralları

- App Review Guideline 5.1.3: sağlık verileri reklam veya veri madenciliği için kullanılamaz, kişinin rızası olmadan üçüncü taraflarla paylaşılamaz ve kişisel sağlık bilgileri iCloud'da saklanamaz.
- Gizlilik politikanızda ne okuduğunuzu ve neden okuduğunuzu belirtmelisiniz; Apple kontrol eder.
- Uygulamanızın Apple Health'e yazdığı veriler uygulamanıza atfedilir; okuduğunuz veriler orijinal kaynağını (`HKSource`) korur, bu kaynağı kayıt sistemine kaynak sistem olarak dahil etmelisiniz.

## Apple Health Kayıtları

Fitness verilerinden ayrı olarak Apple Health, katılımcı sağlık sistemlerinden (çoğunlukla Amerika Birleşik Devletleri'nde) indirilen klinik kayıtları tutabilir ve HealthKit bunları orijinal FHIR kaynağını taşıyan `HKClinicalRecord` nesneleri olarak sunar. Bunları okumak kendi iznini ve yetkisini gerektirir. Bunlar, giyilebilir verilerden farklı bir entegrasyondur ve Anpheros Daily bunları bugün okumaz.

## Anpheros Nerede Yer Alıyor?

Anpheros Platformu, kişinin FHIR R4 kaydını, her giyilebilir cihaz değerini cihaz verisi olarak işaretlenmiş bir Observation, diğer uygulamalar için izin, kaynak bilgisi ve erişim günlüğü olarak depolar. Apple Health'i kendisi okumaz — bu, sizin iOS uygulamanızda gerçekleşir. Anpheros'un kendi uygulaması olan **Anpheros Daily**, iPhone'da (Plus ve Max planları) Apple Health'i okur ve yukarıdaki kodlarla günlük özetleri kayda yazar.

## Sıkça Sorulan Sorular

### Apple Watch verilerini bir sunucudan okuyabilir miyim?
Hayır. Apple Watch verileri eşleştirilmiş iPhone'daki Apple Health'e eşitlenir ve HealthKit yalnızca o cihazdaki bir uygulama tarafından kullanılabilir. Uygulama verileri okur ve sunucunuza gönderir.

### Bir Apple Health web API'si veya REST API'si var mı?
Hayır. Apple, Apple Health için herhangi bir web veya REST API'si sunmamaktadır: HealthKit yalnızca kişinin iPhone'undaki (veya Apple Watch'undaki) bir uygulama içinde çalışır. Verileri bir sunucuda kullanmak için uygulamanız, kişinin izniyle verileri okur ve örneğin FHIR Observations olarak Anpheros'a gönderir.

### Apple Health API'si için bir API anahtarına ihtiyacım var mı veya ücret ödemem gerekiyor mu?
Anahtar ve ücret yok: HealthKit iOS'un bir parçasıdır. Uygulamanızda HealthKit yeteneğine, her veri türü için bir kullanım açıklamasına ve kişinin iznine ihtiyacınız vardır; App Store incelemesi verileri nasıl kullandığınızı kontrol eder.

### Bir kişinin bir HealthKit türüne erişimi reddettiğini nasıl anlarım?
Okuma erişimi için anlayamazsınız: HealthKit gizliliği korumak için bunu gizler ve reddedilen bir tür veri döndürmez. "Veri yok" durumunu normal bir durum olarak ele alın ve Health uygulamasındaki izinleri gözden geçirmek için bir yol sunun.

### Adım sayılarım neden Health uygulamasındakinden daha yüksek?
Muhtemelen birden fazla kaynaktan (iPhone ve Watch) ham örnekleri topluyorsunuzdur. Apple Health'in kendi yinelenen kaldırma işlemini uygulayan `.cumulativeSum` ile birlikte `HKStatisticsCollectionQuery` kullanın.

### Apple Watch kalp atış hızı değişkenliği için hangi LOINC kodu kullanılır?
Apple Health, HRV'yi SDNN olarak depolar, bu da LOINC 80404-7 ile eşleşir. Health Connect, farklı bir istatistik olan RMSSD'yi depolar, bu nedenle ikisini tek bir kod altında karıştırmayın.

## İlgili Konular

- [FHIR'da Giyilebilir Veriler](https://developers.anpheros.com/tr/guides/wearable-data-fhir): eşleme tablosu ve arka uç kodu
- [Health Connect'ten FHIR'a](https://developers.anpheros.com/tr/guides/health-connect-fhir): Android'de aynı konu
- [Kişisel Sağlık Kaydı Uygulaması Nasıl Oluşturulur](https://developers.anpheros.com/tr/guides/personal-health-record-app)
- [Flutter ile Sağlık Uygulaması Nasıl Oluşturulur](https://developers.anpheros.com/tr/guides/healthcare-app-flutter)
