前回の記事で HealthKit を扱う準備と予備知識をまとめたので、今回は実際にデータの読み書きをしていこうと思います!
この記事のゴールとしては、性別と血液型を読み込み、体重を書き込みたいと思います。
前提条件
・Xcode11.3
・Swift5
・ヘルスケアAppで自身のデータを設定済み
【2020年8月4日】Xcode11.6 で動作確認
データ使用の許可を得る
まずは HealthKit に対応しているデバイスか確認
if HKHealthStore.isHealthDataAvailable() {
print("対応")
} else {
print("非対応")
}
iPad に関しては、最新の端末でも HealthKit に対応していないので、この確認は必須です。
もちろん import HealthKit はしといてください。
br>
br>
ヘルスケアデータのアクセス許可
性別と血液型を読み込み、体重を書き込むアクセス許可を得るためのコードを記載します。
// 読み込むデータ
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行目でそれらをまとめたデータを作る → 書き込むって流れなので、流れは簡単です。
ただ、血圧や心拍数、酸素飽和度など、データの種類ごとにしっかり確認しないといけないので、慎重に作業しないといけないですね。
さいごに
今回はデータの読み書きをまとめました。
紐解きながらやってくと、そういうことね!ってなりますが、データの種類が多いと実装も大変になりそうですね。
欲を言えば、メソッドとか引数をもう少しまとめてほしいです。笑



コメント