読者です 読者をやめる 読者になる 読者になる

ROADTO みちログ

ひとのみちのブログ。大阪でiOSアプリの道を歩くフリーランス。

iOS8 「HealthKit」基本処理3つのサンプル

iOS8 iOS - HealthKit

iOS8からの新機能、HealthKitのサンプルコードのメモです。

この記事はAppleの公開情報から作成しております。

f:id:hitonomichi:20140617062920p:plain

HealthKitとは?

健康に関連する情報を管理するためのフレームワーク
健康・ライフログ系アプリのデータベースを統合し、集中かつ安全に管理。
つまり独自の実装なしに健康関連情報にアクセスし、他アプリ間で共有可能。
サードパーティ製のヘルス・フィットネス系アプリを配下に治めようという、
アプリ既出サードパーティにとっては( ゚∀゚)・∵.グハッ!! で
ユーザにとっては統合されて便利で嬉しい仕組み。
なお、健康に関するデータはsensitiveなので、デバイスごとに使用を承認する必要があります。

データベースへのアクセス確認、データ取得、データ保存の仕組み、
データ更新された場合の通知設定、データのバックグラウンドフェッチ、
データ自動取得頻度指定、etc の処理を提供します。

基本的な処理

サンプルコードより下記3点について基本的なコードを抜粋します。

  • ヘルスデータベースへのアクセス
  • データ取得
  • データ保存

サンプルコード ヘルスデータベースへのアクセス

解説はインラインのコメントにて。

@import HealthKit;

@interface AppDelegate()

@property (nonatomic, readwrite) HKHealthStore *healthStore;

@end

@implementation AppDelegate

// アプリ起動時(ソースのサンプルコードから編集しています。)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // ヘルスデータベースへのアクセス準備
    
    if ([HKHealthStore isHealthDataAvailable]) { // HealthKitが使用可能なデバイスかを確認。
        self.healthStore = [[HKHealthStore alloc] init];
        NSSet *writeDataTypes = [self dataTypesToWrite];//dataTypesToWrite内で書き込みたい数量タイプ(HKQuantityType)を指定
        NSSet *readDataTypes = [self dataTypesToRead];  //dataTypesToWrite内で読み込みたい数量タイプ(HKQuantityType)を指定
        
        // HKHealthStore を設定。読み書きアクセス権をユーザーに確認する。
        [self.healthStore requestAuthorizationToShareTypes:writeDataTypes readTypes:readDataTypes completion:^(BOOL success, NSError *error) {
            
            if (!success) {
                NSLog(@"アクセスが拒否されました");
                return;
            }
            NSLog(@"アクセスが許可されました");
            
            // (許可された場合の処理)
            
        }];
    }

    return YES;
}

サンプルコード データ取得

解説はインラインのコメントにて。

// 最近のデータを取得(ソースのサンプルコードから編集しています。)
- (void)fetchMostRecentData {
    // 数量タイプ指定
    HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
    // ソート順指定
    NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];
    // クエリ作成
    HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:weightType
                                                           predicate:nil
                                                               limit:1
                                                     sortDescriptors:@[timeSortDescriptor]
                                                      resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error)
    {
        if (completion && error) {
            NSLog(@"取得に失敗しました");
            return;
        }

        NSLog(@"取得に成功しました");

        // 取得結果
        HKQuantitySample *quantitySample = results.firstObject;
        HKQuantity *quantity = quantitySample.quantity;
                                                          
        //(取得後処理・・・)
                                                          
    }];
    // クエリ実行
    [self.healthStore executeQuery:query];
}

サンプルコード データ保存

解説はインラインのコメントにて。

// 体重データ保存(ソースのサンプルコードから編集しています。)
- (void)saveWeightIntoHealthStore {
    NSNumberFormatter *formatter = [self numberFormatter];
    NSNumber *weight = [formatter numberFromString:@"100"];
    
    // 数量タイプ指定 例では「体重」
    HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
    // 数量指定 例では「体重」を単位「ポンド」で保持
    HKQuantity *weightQuantity = [HKQuantity quantityWithUnit:[HKUnit poundUnit] doubleValue:[weight doubleValue]];
    // HKQuantitySample型で保持 例では「体重」(単位「ポンド」)を開始日・終了日を付与して保持
    HKQuantitySample *weightSample = [HKQuantitySample quantitySampleWithType:weightType quantity:weightQuantity startDate:[NSDate date] endDate:[NSDate date]];
    // ヘルスデータベースに保存
    [self.healthStore saveObject:weightSample withCompletion:^(BOOL success, NSError *error) {
        if (!success) {
            NSLog(@"保存に失敗しました");
            abort();
        }
        NSLog(@"保存に成功しました");
    }];
}


ソースであるサンプルコードでは
HealthKitを使用する準備(Xcodeの設定)や
データ取得処理を非同期で行うなど、
ここでは省略している処理がありますので、
実際に参考にされる場合はソースであるサンプルコード参照をお勧めします。

ソース

当記事はAppleの公開情報を元に作成しております。

自己紹介
メガネは売っていません
高浜 一道(たかはま かずみち)
大阪でiOSアプリの道を歩くフリーランス。
iPad・iPhoneとサーバを連携した、JSONやDBといったキーワードが出てくるツール系が多めです。
お仕事のご依頼やご連絡はこちらから。
お仕事ください!
Web : ROADTO
ML : k-takahama(a)roadto.jp

個人的なアカウントはこちら。
Tw : @hitonomichi
Fb : kazumichi.takahama