iOS8 「HealthKit」基本処理3つのサンプル
iOS8からの新機能、HealthKitのサンプルコードのメモです。
この記事はAppleの公開情報から作成しております。
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の設定)や
データ取得処理を非同期で行うなど、
ここでは省略している処理がありますので、
実際に参考にされる場合はソースであるサンプルコード参照をお勧めします。