最近在項(xiàng)目中遇到HealthKit的數(shù)據(jù)獲取相關(guān)的問(wèn)題譬正,對(duì)此作了一些簡(jiǎn)單的封裝,以便于以后相似需求時(shí)便于調(diào)用檬姥。
相關(guān)類庫(kù)的準(zhǔn)備HealthKit
首先你需要了解對(duì)象的結(jié)構(gòu)
-
HKObjectType用于處理項(xiàng)目中需要的項(xiàng)目類曾我。
HKObjectType大概分成以上幾類,構(gòu)建需求請(qǐng)求的時(shí)候需要嚴(yán)格按照類型來(lái)存儲(chǔ)的 -
HKTypeIdentifiers用于處理項(xiàng)目中你所需要獲取的數(shù)據(jù)的類型健民。
一般來(lái)說(shuō)我們所獲取的數(shù)值是count抒巢,distance之類的,全局搜索可以便于找到你需要的值秉犹。 -
HKUnit獲取完類別以后呢蛉谜,我們需要查詢這個(gè)類別對(duì)應(yīng)的單位(Unit)。這個(gè)分類下的值的單位(米崇堵,千米之類的)
- HKSampleQuery用來(lái) 查詢數(shù)據(jù)對(duì)象型诚。
- HKSample查詢出來(lái)的結(jié)果。
代碼實(shí)踐
//查看healthKit在設(shè)備上是否可用筑辨,ipad不支持HealthKit
if(![HKHealthStore isHealthDataAvailable]) {
NSLog(@"設(shè)備不支持healthKit");
return;
}
//創(chuàng)建healthStore實(shí)例對(duì)象
self.healthStore = [[HKHealthStore alloc] init];
NSMutableSet *healthSet = [NSMutableSet set];HKQuantityType
HKObjectType *stepCount = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
[healthSet addObject:stepCount];HKCategoryType
HKObjectType *standHour = [HKObjectType categoryTypeForIdentifier:HKCategoryTypeIdentifierAppleStandHour];
[healthSet addObject:standHour];HKWorkoutType
HKObjectType *workout = [HKObjectType workoutType]
[healthSet addObject:workout];
//從健康應(yīng)用中獲取權(quán)限
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:healthSet completion:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"獲取步數(shù)權(quán)限成功");
//在這里去獲取數(shù)據(jù)
} else {
NSLog(@"獲取權(quán)限失敗");
}
}];獲取數(shù)據(jù)類型,注意不同數(shù)據(jù)類型的數(shù)據(jù)獲取方式是不一樣的
HKSampleType *sampleType;
要注意獲取的數(shù)據(jù)是分段的俺驶,比如你一天走10000步,可能有幾百條數(shù)據(jù),在獲取每天的站立時(shí)間時(shí)發(fā)現(xiàn)暮现,每一個(gè)小時(shí)是一個(gè)數(shù)據(jù)还绘,鍛煉分鐘數(shù)是每一個(gè)分鐘,在實(shí)際用這個(gè)數(shù)據(jù)時(shí)栖袋,應(yīng)該合理控制數(shù)據(jù)
NSInteger limitNumber = 1000拍顷;
NSSortDescriptor *start = [NSSortDescriptor >sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];
NSSortDescriptor *end = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];
__weak typeof(self) weakSelf = self;
HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:nil limit:limitNumber sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {
@autoreleasepool {
for (HKSample *result in results){
針對(duì)不同子類的result進(jìn)行處理數(shù)據(jù)
在判斷結(jié)果的開(kāi)始時(shí)間和結(jié)束時(shí)間,是否是自己需要的那天的數(shù)據(jù)
}
}
//回到主線程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//數(shù)據(jù)刷新
}];
}];
//執(zhí)行查詢
[self.healthStore executeQuery:sampleQuery];
注意點(diǎn)
不同HKSample實(shí)例的數(shù)據(jù)的獲取方式方法是不一樣的
//HKQuantitySample的子類數(shù)據(jù)塘幅,獲取result.quantity昔案,根據(jù)quantity獲取數(shù)值
//HKCategorySample的子類數(shù)據(jù),獲取的是result.value的值电媳,在獲取站立小時(shí)數(shù)時(shí)發(fā)現(xiàn)踏揣,當(dāng)value值是1的時(shí)候,反而是靜歇時(shí)的數(shù)據(jù)匾乓,這里需要注意
//HKWorkout的子類數(shù)據(jù)捞稿,鍛煉時(shí)間數(shù),大概有duration拼缝,totalEnergyBurned娱局,totalDistance,totalSwimmingStrokeCount這些值來(lái)處理
不同數(shù)據(jù)來(lái)源的數(shù)據(jù)是不一樣的
HKSample 的父類 HKObject有source(8.0以上)和device(9.0以上)倆個(gè)字段來(lái)判斷來(lái)源咧七。這邊需要注意的是多個(gè)數(shù)據(jù)來(lái)源的數(shù)據(jù)衰齐。不要一味的全部相加。