HealthKit之实战读取步数、活动时长、运动距离、已爬楼层、活动能量、健身记录

简介:

- (void)queryStepCount

{

    if (![HKHealthStore isHealthDataAvailable])

    {

        NSLog(@"设备不支持healthKit"); return;

    }

    _healthStore = [[HKHealthStore alloc] init];

    HKObjectType *type1 = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; // 步数

    HKObjectType *type2 = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning]; // 步行+跑步距离

    HKObjectType *type3 = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierFlightsClimbed];     // 已爬楼层

    HKObjectType *tyep4 = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned]; // 活动能量

    HKObjectType *type5 = [HKObjectType activitySummaryType];// 健身记录

    NSSet *set = [NSSet setWithObjects:type1, type2, type3, tyep4, type5, nil]; // 读集合

    

    __weak typeof (&*self) weakSelf = self;

    [_healthStore requestAuthorizationToShareTypes:nil readTypes:set completion:^(BOOL success, NSError * _Nullable error) {

        if (success)

        {

            [weakSelf readStepCount];

        } else

        {

            NSLog(@"healthkit不允许读写");

        }

    }];

}


//查询数据

- (void)readStepCount

{

    HKQuantityType *sampleType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];

    

    //NSSortDescriptors用来告诉healthStore怎么样将结果排序。

    NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];

    NSSortDescriptor *end   = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];

    

    /*查询的基类是HKQuery,这是一个抽象类,能够实现每一种查询目标,这里我们需要查询的步数是一个

     HKSample类所以对应的查询类就是HKSampleQuery

     下面的limit参数传1表示查询最近一条数据,查询多条数据只要设置limit的参数值就可以了

     */

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSDateComponents *dateCom = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:[NSDate date]];

    

    NSDate *startDate, *endDate;

    endDate = [calendar dateFromComponents:dateCom];

    

    [dateCom setHour:0];

    [dateCom setMinute:0];

    [dateCom setSecond:0];

    

    startDate = [calendar dateFromComponents:dateCom];

    NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionStrictStartDate];

    

    __weak typeof (&*_healthStore)weakHealthStore = _healthStore;

    

    HKSampleQuery *q1 = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {

        double sum = 0;

        double sumTime = 0;

        NSLog(@"步数结果=%@", results);

        for (HKQuantitySample *res in results)

        {

            

            sum += [res.quantity doubleValueForUnit:[HKUnit countUnit]];

            

            NSTimeZone *zone = [NSTimeZone systemTimeZone];

            NSInteger interval = [zone secondsFromGMTForDate:res.endDate];

            

            NSDate *startDate = [res.startDate dateByAddingTimeInterval:interval];

            NSDate *endDate   = [res.endDate dateByAddingTimeInterval:interval];


            sumTime += [endDate timeIntervalSinceDate:startDate];

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                //查询是在多线程中进行的,如果要对UI进行刷新,要回到主线程中

                self.title = [NSString stringWithFormat:@"运动步数:%@", @(sum).stringValue];

            }];

        }

        int h = sumTime / 3600;

        int m = ((long)sumTime % 3600)/60;

        NSLog(@"运动时长:%@小时%@", @(h), @(m));

        NSLog(@"运动步数:%@", @(sum));

        if(error) NSLog(@"1error==%@", error);

        [weakHealthStore stopQuery:query];

        NSLog(@"\n\n");

    }];

    

    HKSampleType *timeSampleType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning];

    HKSampleQuery *q2 = [[HKSampleQuery alloc] initWithSampleType:timeSampleType predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {

        double time = 0;

        for (HKQuantitySample *res in results)

        {

            time += [res.quantity doubleValueForUnit:[HKUnit meterUnit]];

        }

        NSLog(@"运动距离===%@", @((long)time));

        if(error) NSLog(@"2error==%@", error);

        [weakHealthStore stopQuery:query];

    }];

    

    HKSampleType *type3 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierFlightsClimbed];

    HKSampleQuery *q3 = [[HKSampleQuery alloc] initWithSampleType:type3 predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {

        double num = 0;

        for (HKQuantitySample *res in results)

        {

            num += [res.quantity doubleValueForUnit:[HKUnit countUnit]];

        }

        NSLog(@"楼层===%@", @(num));

        if(error) NSLog(@"3error==%@", error);

        [weakHealthStore stopQuery:query];

    }];


    HKSampleType *type4 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];

    HKSampleQuery *q4 = [[HKSampleQuery alloc] initWithSampleType:type4 predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {

        double num = 0;

        for (HKQuantitySample *res in results)

        {

            num += [res.quantity doubleValueForUnit:[HKUnit kilocalorieUnit]];

        }

        NSLog(@"卡路里===%@大卡", @((long)num));

        if(error) NSLog(@"4error==%@", error);

        [weakHealthStore stopQuery:query];

        NSLog(@"\n\n");

    }];

    

    NSDateComponents *dateCom5B = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]];

    [dateCom5B setDay:(dateCom5B.day - 10)];

    dateCom5B.calendar = calendar;

    NSDateComponents *dateCom5E = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]];

    dateCom5E.calendar = calendar;

    NSPredicate *predicate5 = [HKActivitySummaryQuery predicateForActivitySummaryWithDateComponents:dateCom5B];

//    NSPredicate *predicate5 = [HKActivitySummaryQuery predicateForActivitySummariesBetweenStartDateComponents:dateCom5B endDateComponents:dateCom5E];

    HKActivitySummaryQuery *q5 = [[HKActivitySummaryQuery alloc] initWithPredicate:predicate5 resultsHandler:^(HKActivitySummaryQuery * _Nonnull query, NSArray<HKActivitySummary *> * _Nullable activitySummaries, NSError * _Nullable error) {

        double energyNum       = 0;

        double exerciseNum     = 0;

        double standNum        = 0;

        double energyGoalNum   = 0;

        double exerciseGoalNum = 0;

        double standGoalNum    = 0;

        for (HKActivitySummary *summary in activitySummaries)

        {

            energyNum       += [summary.activeEnergyBurned doubleValueForUnit:[HKUnit kilocalorieUnit]];

            exerciseNum     += [summary.appleExerciseTime doubleValueForUnit:[HKUnit secondUnit]];

            standNum        += [summary.appleStandHours doubleValueForUnit:[HKUnit countUnit]];

            energyGoalNum   += [summary.activeEnergyBurnedGoal doubleValueForUnit:[HKUnit kilocalorieUnit]];

            exerciseGoalNum += [summary.appleExerciseTimeGoal doubleValueForUnit:[HKUnit secondUnit]];

            standGoalNum    += [summary.appleStandHoursGoal doubleValueForUnit:[HKUnit countUnit]];

        }

        NSLog(@"\n\n");

        NSLog(@"健身记录:energyNum=%@",       @(energyNum));

        NSLog(@"健身记录:exerciseNum=%@",     @(exerciseNum));

        NSLog(@"健身记录:standNum=%@",        @(standNum));

        NSLog(@"健身记录:energyGoalNum=%@",   @(energyGoalNum));

        NSLog(@"健身记录:exerciseGoalNum=%@", @(exerciseGoalNum));

        NSLog(@"健身记录:standGoalNum=%@",    @(standGoalNum));

        if(error) NSLog(@"5error==%@", error);

        [weakHealthStore stopQuery:query];

        NSLog(@"\n\n");

    }];

       

    //执行查询

    [_healthStore executeQuery:q1];

    [_healthStore executeQuery:q2];

    [_healthStore executeQuery:q3];

    [_healthStore executeQuery:q4];

    [_healthStore executeQuery:q5];

}

目录
相关文章
|
2月前
|
存储 测试技术 定位技术
需要统计出轨迹点出入某个区域的信息,包括:驶入时间、驶出时间
Lindorm Ganos 通过内置的 `ST_TrajectoryProfile` 算子高效统计轨迹的出入信息,利用时空索引技术减少扫描量和内存使用,降低计算成本。它通过空间索引+过滤下推减少扫描量,聚合加速提升效率,并在聚合算子内部完成进出点判断和轨迹信息提取。然而,该算子受限于时间阈值设定,可能在轨迹点不均匀采集时产生误差。测试环境下,查询耗时在20秒内,具体表现取决于过滤后的数据量和空间范围复杂度。
14 0
|
5月前
|
图形学 开发者 容器
【Unity实战】按物品掉落率,随机掉落战利品物品系统(附项目源码)
【Unity实战】按物品掉落率,随机掉落战利品物品系统(附项目源码)
124 0
|
6月前
|
机器学习/深度学习 存储 编解码
彩票开奖彩票开奖BCFPL:基于二元分类的低分辨率图像快速停车位识别
彩票开奖BCFPL:基于二元分类的低分辨率图像快速停车位识别
75 0
|
6月前
|
算法 数据挖掘
R语言面板数据回归:含时间固定效应混合模型分析交通死亡率、酒驾法和啤酒税
R语言面板数据回归:含时间固定效应混合模型分析交通死亡率、酒驾法和啤酒税
|
传感器
如何计算摄影参数:分区基准面高程、相对航高、绝对航高、基线长度、航线间隔、航线数、每条航线的相片数、总相片数。
如何计算摄影参数:分区基准面高程、相对航高、绝对航高、基线长度、航线间隔、航线数、每条航线的相片数、总相片数。
1459 0
|
机器学习/深度学习 人工智能 缓存
走近高德驾车ETA(预估到达时间)
ETA(Estimated Time of Arrival),即预估到达时间,指的是用户在当前时刻出发按照给定路线前往目的地预计需要的时长。如何准确地预估ETA对于高德地图的诸多业务板块都起到至关重要的作用。
走近高德驾车ETA(预估到达时间)
算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
|
算法 安全 C++
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
279 0
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
|
JSON 文字识别 Serverless
3.2 行程卡识别应用实践(二)|学习笔记
快速学习3.2 行程卡识别应用实践(二)
3.2 行程卡识别应用实践(二)|学习笔记
|
运维 监控 Cloud Native
3.2 行程卡识别应用实践(一)|学习笔记
快速学习3.2 行程卡识别应用实践(一)
3.2 行程卡识别应用实践(一)|学习笔记
下一篇
无影云桌面