healthkit框架使用
2016-03-28 17:55
483 查看
最近项目需要,可能需要在原有的自行车APP上添加healthkit框架,所以就查看了一些healthkit的资料,发现code4APP竟然没有,github上面的资料也比较少,还有不少用swift写的,自己就研究用oc写healthkit。比较3月21号的苹果发布会虽然出了se手机并不出色,但是更加突出了环境和健康,healthkit在未来医疗健康、运动锻炼领域应该会大有所为。
1、要使用healthkit框架首先要在capabilities里面打开health kit
2、判断设备是否能够使用healthkit框架
- (BOOL)isHealthDataAvailable{
return [HKHealthStore isHealthDataAvailable];
}
3、请求授权设置,所有的设备要请求授权成功后才能进行使用healthkit的方法操作
//一组包含要共享的数据类型,可以写入的数据
NSSet *shareObjectTypes = [NSSet setWithObjects:
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning],
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling],
nil];
//一组包含要读取的数据类型,可以读取的数据
NSSet *readObjectTypes = [NSSet setWithObjects:
//[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierDateOfBirth],
[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierBiologicalSex],
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling],
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight],
nil];
// Request access
[self.healthStore requestAuthorizationToShareTypes:shareObjectTypes
readTypes:readObjectTypes
completion:^(BOOL success, NSError *error)
{
if(success == YES)
{
NSLog(@">>>>>授权成功");
}
else
{
NSLog(@">>>>>授权失败");
NSLog(@"error = %@",error);
4000
}
}];
4、读取数据
读取性别
HKBiologicalSexObject *bioSex = [_healthStore biologicalSexWithError:&error];
NSString *sexString;
switch ((int)bioSex.biologicalSex) {
case HKBiologicalSexNotSet:
sexString = @"NotSet";
break;
case HKBiologicalSexFemale:
sexString = @"Female";
break;
case HKBiologicalSexMale:
sexString = @"Male";
break;
case HKBiologicalSexOther:
sexString = @"Other";
break;
default:
break;
读取身高 ,创建好请求类型,其中要注意请求回来的数据是一组数字,可以设置请求数据的起始时间,例子中请求的是身高,请求回结果后我取得是最后一位,最后需要注意把单位换算,转换成需要的数据的类型,如meterUnit, 如果是体重就是克,可以用gramUnit
HKSampleType *sampleType = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
NSDate *startDate, *endDate;
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionStrictStartDate];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:YES];
HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[sortDescriptor]resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *>
* _Nullable results, NSError * _Nullable error) {
if (!error && results) {
HKQuantitySample *samples = [results lastObject];
double heightMeter = [samples.quantity doubleValueForUnit:[HKUnit meterUnit]];
if (self.delegate && [self.delegate respondsToSelector:@selector(receiveHealthKitHeight:)])
{
[self.delegate receiveHealthKitHeight:heightMeter];
}
}
}];
//使函数生效
[_healthStore executeQuery:sampleQuery];
5、写入数据,其中以写入骑行数据为例,注意创建时间时用[NSDate dateWithTimeIntervalSinceNow:0],这是结束时间,开始时间可以以当前时间为截点,向前推
[NSDate dateWithTimeIntervalSinceNow:-time],请求返回的数据要设置,是枚举类型,11是meter。
NSDate *startDate, *endDate;
endDate = [NSDate dateWithTimeIntervalSinceNow:0];
startDate = [NSDate dateWithTimeIntervalSinceNow:-time];
NSLog(@"startdate = %@, endDate = %@",startDate,endDate);
NSString *unitIdentifier = HKQuantityTypeIdentifierDistanceCycling;
HKQuantityType *quantityTypeIdentifier = [HKObjectType quantityTypeForIdentifier:unitIdentifier];
HKQuantity *quantity = [HKQuantity quantityWithUnit:[HKUnit unitFromLengthFormatterUnit:11] doubleValue:length];
HKQuantitySample *temperatureSample2 = [HKQuantitySample quantitySampleWithType:quantityTypeIdentifier quantity:quantity startDate:startDate endDate:endDate metadata:nil];
HKHealthStore *store = [[HKHealthStore alloc] init];
[store saveObject:temperatureSample2 withCompletion:^(BOOL success, NSError *error)
{
if (success) {
NSLog(@"保存成功");
}else {
NSLog(@"保存失败");
}
}];
下面是代码github的链接https://github.com/WadeZhanggp/Healthkit-Demo
1、要使用healthkit框架首先要在capabilities里面打开health kit
2、判断设备是否能够使用healthkit框架
- (BOOL)isHealthDataAvailable{
return [HKHealthStore isHealthDataAvailable];
}
3、请求授权设置,所有的设备要请求授权成功后才能进行使用healthkit的方法操作
//一组包含要共享的数据类型,可以写入的数据
NSSet *shareObjectTypes = [NSSet setWithObjects:
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning],
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling],
nil];
//一组包含要读取的数据类型,可以读取的数据
NSSet *readObjectTypes = [NSSet setWithObjects:
//[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierDateOfBirth],
[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierBiologicalSex],
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceCycling],
//[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight],
nil];
// Request access
[self.healthStore requestAuthorizationToShareTypes:shareObjectTypes
readTypes:readObjectTypes
completion:^(BOOL success, NSError *error)
{
if(success == YES)
{
NSLog(@">>>>>授权成功");
}
else
{
NSLog(@">>>>>授权失败");
NSLog(@"error = %@",error);
4000
}
}];
4、读取数据
读取性别
HKBiologicalSexObject *bioSex = [_healthStore biologicalSexWithError:&error];
NSString *sexString;
switch ((int)bioSex.biologicalSex) {
case HKBiologicalSexNotSet:
sexString = @"NotSet";
break;
case HKBiologicalSexFemale:
sexString = @"Female";
break;
case HKBiologicalSexMale:
sexString = @"Male";
break;
case HKBiologicalSexOther:
sexString = @"Other";
break;
default:
break;
读取身高 ,创建好请求类型,其中要注意请求回来的数据是一组数字,可以设置请求数据的起始时间,例子中请求的是身高,请求回结果后我取得是最后一位,最后需要注意把单位换算,转换成需要的数据的类型,如meterUnit, 如果是体重就是克,可以用gramUnit
HKSampleType *sampleType = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
NSDate *startDate, *endDate;
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionStrictStartDate];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:YES];
HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[sortDescriptor]resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *>
* _Nullable results, NSError * _Nullable error) {
if (!error && results) {
HKQuantitySample *samples = [results lastObject];
double heightMeter = [samples.quantity doubleValueForUnit:[HKUnit meterUnit]];
if (self.delegate && [self.delegate respondsToSelector:@selector(receiveHealthKitHeight:)])
{
[self.delegate receiveHealthKitHeight:heightMeter];
}
}
}];
//使函数生效
[_healthStore executeQuery:sampleQuery];
5、写入数据,其中以写入骑行数据为例,注意创建时间时用[NSDate dateWithTimeIntervalSinceNow:0],这是结束时间,开始时间可以以当前时间为截点,向前推
[NSDate dateWithTimeIntervalSinceNow:-time],请求返回的数据要设置,是枚举类型,11是meter。
NSDate *startDate, *endDate;
endDate = [NSDate dateWithTimeIntervalSinceNow:0];
startDate = [NSDate dateWithTimeIntervalSinceNow:-time];
NSLog(@"startdate = %@, endDate = %@",startDate,endDate);
NSString *unitIdentifier = HKQuantityTypeIdentifierDistanceCycling;
HKQuantityType *quantityTypeIdentifier = [HKObjectType quantityTypeForIdentifier:unitIdentifier];
HKQuantity *quantity = [HKQuantity quantityWithUnit:[HKUnit unitFromLengthFormatterUnit:11] doubleValue:length];
HKQuantitySample *temperatureSample2 = [HKQuantitySample quantitySampleWithType:quantityTypeIdentifier quantity:quantity startDate:startDate endDate:endDate metadata:nil];
HKHealthStore *store = [[HKHealthStore alloc] init];
[store saveObject:temperatureSample2 withCompletion:^(BOOL success, NSError *error)
{
if (success) {
NSLog(@"保存成功");
}else {
NSLog(@"保存失败");
}
}];
下面是代码github的链接https://github.com/WadeZhanggp/Healthkit-Demo
相关文章推荐
- HealthKit开发快速入门教程大学霸内部教程
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
- HealthKit开发快速入门教程之HealthKit数据的操作
- HealthKit开发教程之HealthKit的辅助数据
- HealthKit开发教程之HealthKit的复合数据
- HealthKit开发教程之HealthKit的主要类型数据
- HealthKit开发教程之HealthKit的辅助数据
- HealthKit开发教程之HealthKit的复合数据
- Commotion框架 —— CMPedometer 统计步数的使用
- iOS利用HealthKit获取健康里的步数和睡眠时间
- Objective-C修改运动步数
- HealthKit读取步数、运动距离、已爬楼层等信息
- HealthKit Swift 教程: workout
- HealthKit Swift 教程: 开始
- HealthKit 没有响应,不能弹出授权
- 集成HealthKit,在iPhone7上Crash问题
- iOS获取设备常用健康数据
- iOS获取健康步数从加速计到healthkit
- iOS 获取健康里的信息(步数和公里数)
- 计步器