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];

}

目录
相关文章
|
监控 NoSQL 大数据
【MongoDB】Replica 频繁插入大数据的问题
【4月更文挑战第2天】【MongoDB】Replica 频繁插入大数据的问题
|
Web App开发 iOS开发
无法安装此app,因为无法验证其完整性 ,解决方案
无法安装此app,因为无法验证其完整性 ,解决方案
|
8月前
|
人工智能 自然语言处理 安全
详解:Claude 3.7 Sonnet 国内使用指南_claude使用教程
Claude 3.7在对话理解和生成能力上都进行了显著的提升
6074 14
|
11月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
438 11
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
730 1
|
11月前
|
SQL 缓存 关系型数据库
MySQL Limit实现原理
本文深入解析了MySQL中`LIMIT`子句的实现原理及其在分页、性能优化等场景下的应用技巧。文章详细介绍了`LIMIT`的基本语法、MySQL内部处理流程,以及如何通过索引优化、覆盖索引等策略提升分页查询的性能,并提供了实践建议。
821 3
|
存储 编解码 算法
在线音频转换工具 - 免费
云库工具是一款强大的音频格式转换器,支持AAC、AC3、MP3、FLAC等多种格式,具备快速高效、简便易用、高质量输出和批量转换的技术优势。适用于多设备兼容、存储优化和专业音频处理场景。无论新手或专业人士,都能轻松满足音频格式转换需求。尝试云库工具,体验高效便捷的转换服务。
996 0
在线音频转换工具 - 免费
|
存储 运维 小程序
【服务器数据恢复】异常断电导致ESXi虚拟机数据丢失的数据恢复案例
服务器数据恢复环境: 一台服务器,虚拟化系统为esxi,上层使用iSCSI的方式实现FC SAN功能,iSCSI通过FreeNAS构建。 FreeNAS采用了UFS2文件系统,esxi虚拟化系统里有3台虚拟机:其中一台虚拟机安装FreeBSD系统,存放数据库文件;一台虚拟机存放网站数据;一台虚拟机安装Windows server系统,存放数据库数据和程序代码。 服务器故障: 机房供电不稳,服务器非正常关机,重启服务器后发现ESXI虚拟化系统无法连接存储。工作人员对服务器进行故障排查,发现UFS2文件系统出现故障,于是fsck修复UFS2文件系统并将ESXI虚拟化系统连接到存储上。 检查文件系
|
图形学
Unity 模型中心点偏移问题解决方法
Unity 模型中心点偏移问题解决方法
1526 1
Unity 模型中心点偏移问题解决方法
|
JavaScript
Proxy error: Could not proxy request错误解决
Proxy error: Could not proxy request错误解决
1087 0