iOS  HealthKit功能

本文展示了如何在iOS应用中使用HealthKit获取用户的步数数据。首先检查HealthKit在设备上的可用性,然后创建HKHealthStore对象并请求获取步数的权限。接着,通过设置查询条件获取当天的步数数据,并将其累加展示在界面上。
1.如下图所示 在Xcode中打开HealthKit功能
iOS <wbr> <wbr>HealthKit功能
2.在需要的地方#import (这里我为了方便直接在viewController写了所有代码,我也在学习这个框架,个人感觉把获取数据权限的代码放在AppDelegate中更好)

获取步数分为两步1.获得权限  2.读取步数 

3.StoryBoard设计
iOS <wbr> <wbr>HealthKit功能
4.代码部分

ViewController.h

[objc]   view plain   copy   iOS <wbr> <wbr>HealthKit功能 iOS <wbr> <wbr>HealthKit功能
  1. #import   
  2. #import   
  3. @interface ViewController UIViewController  
  4. @property (nonatomic,strongHKHealthStore *healthStore;  
  5. @end  
ViewController.m
[objc]   view plain   copy   iOS <wbr> <wbr>HealthKit功能 iOS <wbr> <wbr>HealthKit功能
  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4. @property (weak, nonatomicIBOutlet UILabel *StepsLable;  
  5.   
  6. @end  
  7.   
  8. @implementation ViewController  
  9.   
  10. (void)viewDidLoad  
  11.     [super viewDidLoad];  
  12.     self.StepsLable.layer.cornerRadius self.StepsLable.frame.size.width/2 
  13.     self.StepsLable.layer.borderColor [UIColor redColor].CGColor 
  14.     self.StepsLable.layer.borderWidth 5 
  15.     self.StepsLable.layer.masksToBounds YES 
  16.  
  17. #pragma mark 获取权限  
  18. (IBAction)getAuthority:(id)sender  
  19.  
  20.     //查看healthKit在设备上是否可用,iPad上不支持HealthKit  
  21.     if (![HKHealthStore isHealthDataAvailable])  
  22.         self.StepsLable.text @"该设备不支持HealthKit" 
  23.      
  24.       
  25.     //创建healthStore对象  
  26.     self.healthStore [[HKHealthStore alloc]init];  
  27.     //设置需要获取的权限 这里仅设置了步数  
  28.     HKObjectType *stepType [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];  
  29.     NSSet *healthSet [NSSet setWithObjects:stepType,nil];  
  30.       
  31.     //从健康应用中获取权限  
  32.     [self.healthStore requestAuthorizationToShareTypes:nil readTypes:healthSet completion:^(BOOL success, NSError _Nullable error)  
  33.         if (success)  
  34.             //获取步数后我们调用获取步数的方法  
  35.             [self readStepCount];  
  36.          
  37.         else  
  38.          
  39.             self.StepsLable.text @"获取步数权限失败" 
  40.          
  41.     }];  
  42.  
  43. #pragma mark 读取步数 查询数据  
  44. (void)readStepCount  
  45.  
  46.     //查询采样信息  
  47.     HKSampleType *sampleType [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];  
  48.     //NSSortDescriptor来告诉healthStore怎么样将结果排序  
  49.     NSSortDescriptor *start [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];  
  50.     NSSortDescriptor *end [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];  
  51.     //获取当前时间  
  52.     NSDate *now [NSDate date];  
  53.     NSCalendar *calender [NSCalendar currentCalendar];  
  54.     NSUInteger unitFlags NSCalendarUnitYear NSCalendarUnitMonth NSCalendarUnitDay NSCalendarUnitHour NSCalendarUnitMinute NSCalendarUnitSecond;  
  55.     NSDateComponents *dateComponent [calender components:unitFlags fromDate:now];  
  56.     int hour (int)[dateComponent hour];  
  57.     int minute (int)[dateComponent minute];  
  58.     int second (int)[dateComponent second];  
  59.     NSDate *nowDay [NSDate dateWithTimeIntervalSinceNow (hour*3600 minute 60 second) ];  
  60.     //时间结果与想象中不同是因为它显示的是0区  
  61.     NSLog(@"今天%@",nowDay);  
  62.     NSDate *nextDay [NSDate dateWithTimeIntervalSinceNow (hour*3600 minute 60 second)  + 86400];  
  63.     NSLog(@"明天%@",nextDay);  
  64.     NSPredicate *predicate [HKQuery predicateForSamplesWithStartDate:nowDay endDate:nextDay options:(HKQueryOptionNone)];  
  65.       
  66.       
  67.       
  68.     HKSampleQuery *sampleQuery [[HKSampleQuery alloc]initWithSampleType:sampleType predicate:predicate limit:0 sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery _Nonnull query, NSArray<__kindof HKSample *> _Nullable results, NSError _Nullable error)  
  69.         //设置一个int型变量来作为步数统计  
  70.         int allStepCount 0 
  71.         for (int 0results.count++)  
  72.             //把结果转换为字符串类型  
  73.             HKQuantitySample *result results[i];  
  74.             HKQuantity *quantity result.quantity 
  75.             NSMutableString *stepCount (NSMutableString *)quantity;  
  76.             NSString *stepStr =[ NSString stringWithFormat:@"%@",stepCount];  
  77.             //获取51 count此类字符串前面的数字  
  78.             NSString *str [stepStr componentsSeparatedByString:@" "][0];  
  79.             int stepNum [str intValue];  
  80.             NSLog(@"%d",stepNum);  
  81.             //把一天中所有时间段中的步数加到一起  
  82.             allStepCount allStepCount stepNum;  
  83.          
  84.           
  85.         //查询要放在多线程中进行,如果要对UI进行刷新,要回到主线程  
  86.         [[NSOperationQueue mainQueue]addOperationWithBlock:^{  
  87.             self.StepsLable.text [NSString stringWithFormat:@"%d",allStepCount];  
  88.         }];  
  89.     }];  
  90.     //执行查询  
  91.     [self.healthStore executeQuery:sampleQuery];  
  92.  
  93. (void)didReceiveMemoryWarning  
  94.     [super didReceiveMemoryWarning];  
  95.     // Dispose of any resources that can be recreated.  
  96.  
  97.   
  98. @end  
5.完成效果
iOS <wbr> <wbr>HealthKit功能

点击按钮之后,首先获取获得步数权限··
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值