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