iOS8のHealthKitについて

はじめに

最近、様々なメーカーが健康に関するデバイスやアプリを出しています。同じメーカーの場合はデータを連携させることが出来る場合もありますが、多くの場合は一つで完結してしまっています。そういった状況の中で、AppleがHealthKitというものを発表しました。
HealthKitでどのようなことができるか調べてみました。

どんなことができるのか

HealthKitは健康に関するデータを1箇所で管理することができる機能です。アプリ内ではなく、端末内にデータを保存して読みだすことができます。現時点でできることはこれだけです。(その他には、「Health app」というアプリがデフォルトのアプリとして追加されているだけです。これも端末に登録されているデータをみたり、データを登録するだけのアプリです。)

どのように使うのか

実際に使用するにはどのようにするのか調べてみました。

・App ID
App IDにHealthKitを使用する設定が追加されていますので、有効にする必要があります。既にiOS Dev Centerで設定できるようになっています。(当然ながらまだBeta扱いですが。)
健康に関するデータなので、セキュアにするためにこのようになっているようです。

・データ種別
HealthKitには、身長や体重、年齢、摂取したカロリー等様々なデータがあります。それらを区別するのが、HKObjectTypeです。このクラスはabstractクラスなので、実際にはサブクラスのHKCharacteristicTypeやHTSampleTypeを使用します。HTSampleTypeにはサブクラスとしてHKCategoryTypeとHKQuantityTypeがあります。
身長のデータ種別を取得するには下記の用になります。

 HKQuantityType *type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];

・データアクセス
実際にデータにアクセスするには、HKHealthStoreというクラスを使用します。

 HKHealthStore* healthStore = [[HKHealthStore alloc] init];

このクラスに対して、どのデータ種別を読み書きするのかを指定することでデータにアクセスできるようになります。

    HKHealthStore* healthStore = [[HKHealthStore alloc] init];
    
    NSSet* writeTypes = [NSSet setWithObjects:
                         [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDietaryCalories],
                         [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned],
                         [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight],
                         [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass],
                         nil];
    
    NSSet* readTypes = [NSSet setWithObjects:
                        [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDietaryCalories],
                        [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned],
                        [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight],
                        [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass],
                        nil];
    
    [healthStore requestAuthorizationToShareTypes:writeTypes readTypes:readTypes completion:^(BOOL success, NSError *error) {
        // ここで成功か失敗かを判断して処理を行う。
    }];

・数量、単位
データを扱うために、HKQuantityというクラスとHKUnitというクラスがあります。
それぞれ、名前通り数量と単位のクラスです。

 HKQuantity* quantity = [HKQuantity quantityWithUnit:[HKUnit meterUnit] doubleValue:2.0];

HKQuantityに開始日と終了日という日付情報がついたクラスがHKQuantitySampleというクラスになります。

 HKQuantitySample* todayHeight = [HKQuantitySample quantitySampleWithType:type quantity:quantity startDate:[NSDate date] endDate:[NSDate date]];

・データ保存
データを保存する場合は、前述のHKQuantitySampleを保存します。

 [healthStore saveObject:todayHeight withCompletion:^(BOOL success, NSError *error) {
  // ここで成功か失敗かを判断して処理を行う。
 }];

・データ読込
データを読み込むときには、HKQueryとそのサブクラスのHKSampleQueryというクラスも使用します。名前から分かる通りデータを検索するための条件を設定するクラスです。
以下は指定した体重以上のデータを取得しています。

 HKQuantityType *type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
 HKQuantity *weight = [HKQuantity quantityWithUnit:[HKUnit gramUnit] doubleValue:99999.99];
 NSPredicate* predicate = [HKQuery predicateForQuantitySamplesWithOperatorType:NSGreaterThanPredicateOperatorType quantity:weight];
 
 HKSampleQuery *query = [[HKSampleQuery alloc]initWithSampleType:type predicate:predicate limit:10 sortDescriptors:nil resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error){
  // ここで成功か失敗か判断して処理を書く。
 }];
 [healthStore executeQuery:query];


以上の様にデータは簡単に扱うことができます。

最後に

今回はHealthKitの概要について調べてみました。
上にも書きましたが、HealthKitはデータを管理する機能しかないですが、
その共通のデータを管理する機能によって、現在はそれぞれのアプリが個別に管理しているデータを共有できるようになります。それぞれのアプリがHealthKitに対応していくことで、それらのデータを利用していろいろと面白い使い方がされるようになっていくのではないかと思います。

ちなみに

イサナドットネットではVitalConnect様のHealthPatch™を使って、ウェアラブルセンサーから取得できる生体情報を元に
ユーザのストレスや自律神経の状態を推測し、ユーザの状態に合わせた家電の操作を行うアプリケーションを開発いたしました。 iOS8がリリースされたらこういうアプリケーションとも連携できそうなので楽しみです。


iOS8のHealthKitについて iOS8のHealthKitについて Reviewed by Masafumi Abe on 17:08:00 Rating: 5
Powered by Blogger.