Commit 00aca5f1 authored by 王品堯's avatar 王品堯

HA-52 增加HKAnchoredObjectQuery的方式

parent a656bacd
......@@ -12,6 +12,7 @@
- (void)fitness_getStepCountOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_geStepSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_geStepSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_getDailyStepSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_saveSteps:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)fitness_initializeStepEventObserver:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
......
......@@ -75,13 +75,45 @@
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting heart rate samples: %@", error);
callback(@[RCTMakeError(@"error getting heart rate samples", nil, nil)]);
NSLog(@"error getting step samples: %@", error);
callback(@[RCTMakeError(@"error getting step samples", nil, nil)]);
return;
}
}];
}
- (void)fitness_geStepSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
HKUnit *unit = [RCTAppleHealthKit hkUnitFromOptions:input key:@"unit" withDefault:[HKUnit countUnit]];
NSUInteger limit = [RCTAppleHealthKit uintFromOptions:input key:@"limit" withDefault:HKObjectQueryNoLimit];
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return;
}
HKQuantityType *stepCountType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
NSPredicate * predicate = [RCTAppleHealthKit predicateForSamplesBetweenDates:startDate endDate:endDate];
[self fetchQuantitySamplesOfTypeByAnchor:stepCountType
unit:unit
predicate:predicate
ascending:ascending
limit:limit
completion:^(NSDictionary *results, NSError *error) {
if(results){
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting step samples by anchor : %@", error);
callback(@[RCTMakeError(@"error getting step samples by anchor", nil, nil)]);
return;
}
}];
}
- (void)fitness_getDailyStepSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
......
......@@ -11,5 +11,6 @@
@interface RCTAppleHealthKit (Methods_Sleep)
- (void)sleep_getSleepSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)sleep_getSleepSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
@end
......@@ -43,5 +43,30 @@
}
- (void)sleep_getSleepSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return;
}
NSPredicate *predicate = [RCTAppleHealthKit predicateForSamplesBetweenDates:startDate endDate:endDate];
NSUInteger limit = [RCTAppleHealthKit uintFromOptions:input key:@"limit" withDefault:HKObjectQueryNoLimit];
[self fetchSleepCategorySamplesForPredicateByAnchor:predicate
limit:limit
completion:^(NSDictionary *results, NSError *error) {
if(results){
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting sleep samples by anchor: %@", error);
callback(@[RCTMakeError(@"error getting sleep samples by anchor", nil, nil)]);
return;
}
}];
}
@end
......@@ -3,8 +3,10 @@
@interface RCTAppleHealthKit (Methods_Vitals)
- (void)vitals_getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)vitals_getHeartRateSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)vitals_getBodyTemperatureSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)vitals_getBloodPressureSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)vitals_getBloodPressureSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
- (void)vitals_getRespiratoryRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
@end
......@@ -40,6 +40,40 @@
}];
}
- (void)vitals_getHeartRateSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
HKQuantityType *heartRateType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
HKUnit *count = [HKUnit countUnit];
HKUnit *minute = [HKUnit minuteUnit];
HKUnit *unit = [RCTAppleHealthKit hkUnitFromOptions:input key:@"unit" withDefault:[count unitDividedByUnit:minute]];
NSUInteger limit = [RCTAppleHealthKit uintFromOptions:input key:@"limit" withDefault:HKObjectQueryNoLimit];
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return;
}
NSPredicate * predicate = [RCTAppleHealthKit predicateForSamplesBetweenDates:startDate endDate:endDate];
[self fetchQuantitySamplesOfTypeByAnchor:heartRateType
unit:unit
predicate:predicate
ascending:ascending
limit:limit
completion:^(NSDictionary *results, NSError *error) {
if(results){
callback(@[[NSNull null], results]);
return;
} else {
NSLog(@"error getting heart rate samples: %@", error);
callback(@[RCTMakeError(@"error getting heart rate samples", nil, nil)]);
return;
}
}];
}
- (void)vitals_getBodyTemperatureSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
......@@ -156,6 +190,91 @@
}];
}
- (void)vitals_getBloodPressureSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
HKCorrelationType *bloodPressureCorrelationType = [HKCorrelationType correlationTypeForIdentifier:HKCorrelationTypeIdentifierBloodPressure];
HKQuantityType *systolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic];
HKQuantityType *diastolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureDiastolic];
HKUnit *unit = [RCTAppleHealthKit hkUnitFromOptions:input key:@"unit" withDefault:[HKUnit millimeterOfMercuryUnit]];
NSUInteger limit = [RCTAppleHealthKit uintFromOptions:input key:@"limit" withDefault:HKObjectQueryNoLimit];
BOOL ascending = [RCTAppleHealthKit boolFromOptions:input key:@"ascending" withDefault:false];
NSDate *startDate = [RCTAppleHealthKit dateFromOptions:input key:@"startDate" withDefault:nil];
NSDate *endDate = [RCTAppleHealthKit dateFromOptions:input key:@"endDate" withDefault:[NSDate date]];
if(startDate == nil){
callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]);
return;
}
NSPredicate * predicate = [RCTAppleHealthKit predicateForSamplesBetweenDates:startDate endDate:endDate];
[self fetchCorrelationSamplesOfTypeByAnchor:bloodPressureCorrelationType
unit:unit
predicate:predicate
ascending:ascending
limit:limit
completion:^(NSDictionary *results, NSError *error) {
if(results){
NSMutableArray *data = [NSMutableArray arrayWithCapacity:1];
for (NSDictionary *sample in [results objectForKey:@"samples"]) {
HKCorrelation *bloodPressureValues = [sample valueForKey:@"correlation"];
HKQuantitySample *bloodPressureSystolicValue = [bloodPressureValues objectsForType:systolicType].anyObject;
HKQuantitySample *bloodPressureDiastolicValue = [bloodPressureValues objectsForType:diastolicType].anyObject;
NSString *deviceName = bloodPressureSystolicValue.device.name ? bloodPressureSystolicValue.device.name : @"";
NSString *deviceManufacturer = bloodPressureSystolicValue.device.manufacturer ? bloodPressureSystolicValue.device.manufacturer : @"";
NSString *deviceHardwareVer = bloodPressureSystolicValue.device.hardwareVersion ? bloodPressureSystolicValue.device.hardwareVersion : @"";
NSString *deviceSoftwareVer = bloodPressureSystolicValue.device.softwareVersion ? bloodPressureSystolicValue.device.softwareVersion : @"";
NSString *sourceName = bloodPressureSystolicValue.sourceRevision.source.name;
NSString *sourceId = bloodPressureSystolicValue.sourceRevision.source.bundleIdentifier;
NSString *uuid = bloodPressureValues.UUID.UUIDString;
NSError *error;
NSDictionary *metaDict;
if(bloodPressureSystolicValue.metadata == nil){
metaDict = [[NSDictionary alloc] init];
}else{
metaDict = bloodPressureSystolicValue.metadata;
}
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:metaDict options:NSJSONWritingPrettyPrinted error:&error];
NSString *metadata =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSDictionary *elem = @{
@"bloodPressureSystolicValue" : @([bloodPressureSystolicValue.quantity doubleValueForUnit:unit]),
@"bloodPressureDiastolicValue" : @([bloodPressureDiastolicValue.quantity doubleValueForUnit:unit]),
@"startDate" : [sample valueForKey:@"startDate"],
@"endDate" : [sample valueForKey:@"endDate"],
@"deviceName" : deviceName,
@"deviceManufacturer" : deviceManufacturer,
@"deviceHardware" : deviceHardwareVer,
@"deviceSoftware" : deviceSoftwareVer,
@"sourceName" : sourceName,
@"sourceId" : sourceId,
@"unit" : unit.description,
@"uuid" : uuid,
@"metadata" : metadata
};
[data addObject:elem];
}
NSDictionary *result = @{
@"samples" : data,
@"deleteSamples" : [results objectForKey:@"deleteSamples"]
};
callback(@[[NSNull null], result]);
return;
} else {
NSLog(@"error getting blood pressure samples by anchor: %@", error);
callback(@[RCTMakeError(@"error getting blood pressure samples by anchor", nil, nil)]);
return;
}
}];
}
- (void)vitals_getRespiratoryRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
{
......
......@@ -45,4 +45,22 @@
limit:(NSUInteger)lim
completion:(void (^)(NSArray *, NSError *))completion;
- (void)fetchQuantitySamplesOfTypeByAnchor:(HKQuantityType *)quantityType
unit:(HKUnit *)unit
predicate:(NSPredicate *)predicate
ascending:(BOOL)asc
limit:(NSUInteger)lim
completion:(void (^)(NSDictionary *, NSError *))completion;
- (void)fetchCorrelationSamplesOfTypeByAnchor:(HKQuantityType *)quantityType
unit:(HKUnit *)unit
predicate:(NSPredicate *)predicate
ascending:(BOOL)asc
limit:(NSUInteger)lim
completion:(void (^)(NSDictionary *, NSError *))completion;
- (void)fetchSleepCategorySamplesForPredicateByAnchor:(NSPredicate *)predicate
limit:(NSUInteger)lim
completion:(void (^)(NSDictionary *, NSError *))completion;
@end
......@@ -110,6 +110,11 @@ RCT_EXPORT_METHOD(getStepCountSamples:(NSDictionary *)input callback:(RCTRespons
[self fitness_geStepSamples:input callback:callback];
}
RCT_EXPORT_METHOD(getStepCountSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self fitness_geStepSamplesByAnchor:input callback:callback];
}
RCT_EXPORT_METHOD(getDailyStepCountSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self fitness_getDailyStepSamples:input callback:callback];
......@@ -140,6 +145,11 @@ RCT_EXPORT_METHOD(getHeartRateSamples:(NSDictionary *)input callback:(RCTRespons
[self vitals_getHeartRateSamples:input callback:callback];
}
RCT_EXPORT_METHOD(getHeartRateSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self vitals_getHeartRateSamplesByAnchor:input callback:callback];
}
RCT_EXPORT_METHOD(getBodyTemperatureSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self vitals_getBodyTemperatureSamples:input callback:callback];
......@@ -150,6 +160,11 @@ RCT_EXPORT_METHOD(getBloodPressureSamples:(NSDictionary *)input callback:(RCTRes
[self vitals_getBloodPressureSamples:input callback:callback];
}
RCT_EXPORT_METHOD(getBloodPressureSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self vitals_getBloodPressureSamplesByAnchor:input callback:callback];
}
RCT_EXPORT_METHOD(getRespiratoryRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self vitals_getRespiratoryRateSamples:input callback:callback];
......@@ -165,6 +180,11 @@ RCT_EXPORT_METHOD(getSleepSamples:(NSDictionary *)input callback:(RCTResponseSen
[self sleep_getSleepSamples:input callback:callback];
}
RCT_EXPORT_METHOD(getSleepSamplesByAnchor:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self sleep_getSleepSamplesByAnchor:input callback:callback];
}
RCT_EXPORT_METHOD(getInfo:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
{
[self getModuleInfo:input callback:callback];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment