【Swift5】HealthKit 超入門−データ読み書き編−

前回の記事で HealthKit を扱う準備と予備知識をまとめたので、今回は実際にデータの読み書きをしていこうと思います!

この記事のゴールとしては、性別と血液型を読み込み、体重を書き込みたいと思います。

前提条件

・Xcode11.3
・Swift5
・ヘルスケアAppで自身のデータを設定済み

【2020年8月4日】Xcode11.6 で動作確認

データ使用の許可を得る

まずは HealthKit に対応しているデバイスか確認

if HKHealthStore.isHealthDataAvailable() {
    print("対応")
} else {
    print("非対応")
}

iPad に関しては、最新の端末でも HealthKit に対応していないので、この確認は必須です。
もちろん import HealthKit はしといてください。

ヘルスケアデータのアクセス許可

性別と血液型を読み込み、体重を書き込むアクセス許可を得るためのコードを記載します。

// 読み込むデータ
let read = Set(arrayLiteral: HKObjectType.characteristicType(forIdentifier: .biologicalSex)!, // 性別
                             HKObjectType.characteristicType(forIdentifier: .bloodType)!)     // 血液型
// 書き込むデータ
let write = Set(arrayLiteral: HKObjectType.quantityType(forIdentifier: .bodyMass)!)           // 体重

let healthStore = HKHealthStore()
healthStore.requestAuthorization(toShare: write, read: read, completion: { (status, error) in
    if status {
        print("認証済み")
    } else {
        print(error?.localizedDescription ?? "認証拒否")
    }
})

こういった認証系の処理は viewDidLoad() で処理されることが多いですが、
上記コードを実行したら、下記のような Apple お手製の画面が立ち上がるので、viewDidAppear みたいに画面構築後に呼ばないとワーニングが表示されるのでご注意ください。

この画面で許可したらいよいよ取得です。(`・ω・´)+

データを読み込む

性別と血液型を取得してみます。
性別や血液型は単位なしの単一データなので、静的メソッドで取得できます。
前提条件でも書きましたが、ヘルスケアAppにデータが登録されているものとします。

let healthStore = HKHealthStore()
do {
    // 性別
    let biologicalSex = try healthStore.biologicalSex()
    switch biologicalSex.biologicalSex {
    case .female:
        print("女")
    case .male:
        print("男")
    case .notSet:
        print("非設定")
    default:
        print("エラー")
    }
    // 血液型
    let bloodType = try healthStore.bloodType()
    switch bloodType.bloodType {
    case .aPositive:
        print("A+")
    case .aNegative:
        print("A-")
    case .bPositive:
        print("B+")
    case .bNegative:
        print("B-")
    case .abPositive:
        print("AB+")
    case .abNegative:
        print("AB-")
    case .oPositive:
        print("O+")
    case .oNegative:
        print("O-")
    default:
        print("エラー")
    }
} catch {
    print(error.localizedDescription)
}

データを書き込む

体重は単位ありの複数データなので、HKUnit/HKQuantity/HKQuantityType でデータを作成しないといけません。

let healthStore = HKHealthStore()
let quantity = HKQuantity(unit: HKUnit.gramUnit(with: .kilo), doubleValue: 60) // 60が体重
let quantityType = HKObjectType.quantityType(forIdentifier: .bodyMass)!
let weightData = HKQuantitySample(type: quantityType,
                                        quantity: quantity,
                                        start: Date(),
                                        end: Date())
healthStore.save(weightData, withCompletion: { (success, error) in
    if success {
        print("書き込み成功")
    } else {
        print(error?.localizedDescription ?? "エラー")
    }
})

2行目で「数字」と「単位」を指定して、3行目で「なんの数字か」を指定しています。
4行目でそれらをまとめたデータを作る → 書き込むって流れなので、流れは簡単です。

ただ、血圧や心拍数、酸素飽和度など、データの種類ごとにしっかり確認しないといけないので、慎重に作業しないといけないですね。

さいごに

今回はデータの読み書きをまとめました。
紐解きながらやってくと、そういうことね!ってなりますが、データの種類が多いと実装も大変になりそうですね。
欲を言えば、メソッドとか引数をもう少しまとめてほしいです。笑

Swift
スポンサーリンク

コメント