最近项目需要,可能需要在原有的自行车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);
}
}];
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