本文共 12265 字,大约阅读时间需要 40 分钟。
方法来请求获取HealthKit数据的权限。对每种类型的数据,你都必须请求许可来共享和读取。 SignedData ::= SEQUENCE { version CMSVersion, digestAlgorithms DigestAlgorithmIdentifiers, encapContentInfo EncasulatedContentInfo, signerInfos SignerInfo }
SignerInfo ::= SEQUENCE { version CMSVersion, sid SignerIdentifier, digestAlgorithm DigestAlgorithmIdentifier, signatureAlgorithem SignatureAlgorithmIdentifier, signatureSignatureValue }
#import <UIKit/UIKit.h>
#import <HealthKit/HealthKit.h>///健康的头文件
@interface ViewController : UIViewController
@property (nonatomic,strong)HKHealthStore *healthStore;
@end
//===========获取步数
#import "ViewController.h"
@interface ViewController ()
@property (strong,nonatomic) UILabel *StepsLable;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UILabel *StepsLable=[[UILabelalloc]initWithFrame:CGRectMake(30, 100, 200, 50)];
self.StepsLable=StepsLable;
[self.viewaddSubview:StepsLable];
// self.StepsLable.layer.cornerRadius = self.StepsLable.frame.size.width/2;
self.StepsLable.layer.borderColor = [UIColor redColor].CGColor;
self.StepsLable.layer.borderWidth = 5;
self.StepsLable.layer.masksToBounds = YES;
NSTimer *timer=[NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(timerrepeat)userInfo:nilrepeats:YES];
[[NSRunLoopcurrentRunLoop]addTimer:timerforMode:NSRunLoopCommonModes];
}
-(void)timerrepeat{
NSLog(@"定时器执行");
[selfgetAuthority];
}
#pragma mark 获取权限
- (void)getAuthority
{
//查看healthKit在设备上是否可用,iPad上不支持HealthKit
if (![HKHealthStoreisHealthDataAvailable]) {
self.StepsLable.text = @"该设备不支持HealthKit";
}
//创建healthStore对象
self.healthStore = [[HKHealthStorealloc]init];
//设置需要获取的权限类型这里仅设置了步数
HKObjectType *stepType = [HKObjectTypequantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
NSSet *healthSet = [NSSetsetWithObjects:stepType,nil];//权限集合
//从健康应用中获取权限
[self.healthStorerequestAuthorizationToShareTypes:nilreadTypes:healthSet completion:^(BOOL success,NSError * _Nullable error) {
if (success) {
//获取步数后我们调用获取步数的方法
[selfreadStepCount];
}
else
{
self.StepsLable.text =@"获取步数权限失败";
}
}];
}
#pragma mark 读取步数查询数据
- (void)readStepCount
{
//查询采样信息
HKSampleType *sampleType = [HKQuantityTypequantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
//NSSortDescriptor来告诉healthStore怎么样将结果排序
NSSortDescriptor *start = [NSSortDescriptorsortDescriptorWithKey:HKSampleSortIdentifierStartDateascending:NO];
NSSortDescriptor *end = [NSSortDescriptorsortDescriptorWithKey:HKSampleSortIdentifierEndDateascending:NO];
//获取当前时间
NSDate *now = [NSDatedate];
NSCalendar *calender = [NSCalendarcurrentCalendar];
NSUInteger unitFlags =NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *dateComponent = [calendercomponents:unitFlags fromDate:now];
int hour = (int)[dateComponenthour];
int minute = (int)[dateComponentminute];
int second = (int)[dateComponentsecond];
NSDate *nowDay = [NSDatedateWithTimeIntervalSinceNow: - (hour*3600 + minute * 60 + second) ];
//时间结果与想象中不同是因为它显示的是0区
// NSLog(@"今天%@",nowDay);
NSDate *nextDay = [NSDatedateWithTimeIntervalSinceNow: - (hour*3600 + minute * 60 + second) + 86400];
// NSLog(@"明天%@",nextDay);
NSPredicate *predicate = [HKQuerypredicateForSamplesWithStartDate:nowDayendDate:nextDay options:(HKQueryOptionNone)];//谓词过滤,这里过滤的是今天的数据
/*查询的基类是HKQuery,这是一个抽象类,能够实现每一种查询目标,这里我们需要查询的步数是一个HKSample类所以对应的查询类是HKSampleQuery(继承与HKQuery)。下面的limit参数传1表示查询最近一条数据,查询多条数据只要设置limit的参数值(无论什么值)就可以了*/
HKSampleQuery *sampleQuery = [[HKSampleQueryalloc]initWithSampleType:sampleTypepredicate:predicate limit:0 sortDescriptors:@[start,end]resultsHandler:^(HKSampleQuery *_Nonnull query,NSArray<__kindofHKSample *> * _Nullable results,NSError * _Nullable error) {
//设置一个int型变量来作为步数统计
int allStepCount = 0;
for (int i = 0; i < results.count; i ++) {
//把结果转换为字符串类型
HKQuantitySample *result = results[i];
HKQuantity *quantity = result.quantity;
NSMutableString *stepCount = (NSMutableString *)quantity;
NSString *stepStr =[NSString stringWithFormat:@"%@",stepCount];
//获取51 count此类字符串前面的数字
NSString *str = [stepStrcomponentsSeparatedByString:@" "][0];
int stepNum = [strintValue];
// NSLog(@"%d",stepNum);
//把一天中所有时间段中的步数加到一起
allStepCount = allStepCount + stepNum;
}
NSLog(@"--总步数-----%d",allStepCount);
//查询要放在多线程中进行,如果要对UI进行刷新,要回到主线程
[[NSOperationQueuemainQueue]addOperationWithBlock:^{
self.StepsLable.text = [NSStringstringWithFormat:@"%d",allStepCount];
}];
}];
//执行查询
[self.healthStoreexecuteQuery:sampleQuery];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
-(void)testone{
//创建healthStore实例对象
self.healthStore = [[HKHealthStore alloc] init];
//设置需要获取的权限这里仅设置了步数
HKObjectType *stepCount = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
NSSet *healthSet = [NSSet setWithObjects:stepCount, nil];
//从健康应用中获取权限
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:healthSet completion:^(BOOL success, NSError * _Nullable error) {
if (success)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc ]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *now = [NSDate date];
NSString *todaystr = [formatter stringFromDate:now];
NSDate *today = [formatter dateFromString:todaystr];
NSDate *next = [today dateByAddingTimeInterval:24*60*60];
//定义需要获取的数据为步数
HKQuantityType *quantityType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
//设置获取的步数时间间隔
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.day = 1;
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:today endDate:next options:HKQueryOptionStrictStartDate];
NSString *deviceName=@"lambo";
//创建查询统计对象collectionQuery
HKStatisticsCollectionQuery *collectionQuery = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType quantitySamplePredicate:predicate options: HKStatisticsOptionCumulativeSum | HKStatisticsOptionSeparateBySource anchorDate:[NSDate dateWithTimeIntervalSince1970:0] intervalComponents:dateComponents];
collectionQuery.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection * __nullable result, NSError * __nullable error) {
int numberOfSteps = 0;
for (HKStatistics *statistic in result.statistics) {
for (HKSource *source in statistic.sources) {
//HKSource对象中的name可用于区分健康数据来源--deviceName----app名称
if ([source.name isEqualToString:deviceName]) {
int steps = [[statistic sumQuantityForSource:source] doubleValueForUnit:[HKUnit countUnit]];
numberOfSteps += steps;
}
//deviceName是根据接入的设备做的标记,
if ([deviceName isEqualToString:@"iPhone"]) {
if ([source.name isEqualToString:[UIDevice currentDevice].name]) {
int steps = [[statistic sumQuantityForSource:source] doubleValueForUnit:[HKUnit countUnit]];
numberOfSteps += steps;
}
}else if ([deviceName isEqualToString:@"iWatch"] && ![source.name isEqualToString:[UIDevice currentDevice].name]){
if ([source.bundleIdentifier hasPrefix:@"com.apple.health"]) {
int steps = [[statistic sumQuantityForSource:source] doubleValueForUnit:[HKUnit countUnit]];
numberOfSteps += steps;
}
}else if ([deviceName isEqualToString:@"xiaomi"]){
if ([source.name isEqualToString:@"小米运动"] || [source.bundleIdentifier isEqualToString:@"HM.wristband"]) {
int steps = [[statistic sumQuantityForSource:source] doubleValueForUnit:[HKUnit countUnit]];
numberOfSteps += steps;
}
}
}
}
NSLog(@"ff = %d",numberOfSteps);
//步数看这里就好
NSString * stepString = [NSString stringWithFormat:@"%d",numberOfSteps];
};
[self.healthStore executeQuery:collectionQuery];
}
else
{
NSLog(@"获取步数权限失败");
}
}];
}