diff --git a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.h b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.h index 60a9c6b9f2d1f1b68fb04d593f786932a0dc3a39..108450cf0d1def81906e0e184467a194247d3b49 100644 --- a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.h +++ b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.h @@ -11,6 +11,7 @@ @interface RCTAppleHealthKit (Methods_Fitness) - (void)fitness_getStepCountOnDay:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback; +- (void)fitness_geStepSamples:(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; diff --git a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.m b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.m index 5406c57e2fa961f09216ee56fe60a13d0e8efc5d..04c19d39c5a94045e3f2ce86bbc6b3b29c7f0e5b 100644 --- a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.m +++ b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.m @@ -49,6 +49,40 @@ } +- (void)fitness_geStepSamples:(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 fetchQuantitySamplesOfType:stepCountType + unit:unit + predicate:predicate + ascending:ascending + limit:limit + completion:^(NSArray *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)fitness_getDailyStepSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback { HKUnit *unit = [RCTAppleHealthKit hkUnitFromOptions:input key:@"unit" withDefault:[HKUnit countUnit]]; @@ -56,6 +90,7 @@ 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]]; + NSString *gap = [input objectForKey: @"gap"]; if(startDate == nil){ callback(@[RCTMakeError(@"startDate is required in options", nil, nil)]); return; @@ -69,6 +104,7 @@ endDate:endDate ascending:ascending limit:limit + gap:gap completion:^(NSArray *arr, NSError *err){ if (err != nil) { NSLog(@"error with fetchCumulativeSumStatisticsCollection: %@", err); diff --git a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m index 74c53cb74cdab407ada69d6ca2e4bc4326fc31db..500fafb1e66ff057ab3760c1563022a622ba606d 100644 --- a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m +++ b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m @@ -106,12 +106,41 @@ 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 = bloodPressureSystolicValue.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]; diff --git a/RCTAppleHealthKit/RCTAppleHealthKit+Queries.h b/RCTAppleHealthKit/RCTAppleHealthKit+Queries.h index a1653a2ec2e5e7eb1d9d1bd587f81f36b516a2be..756f403a6e619234090230b5a92f83add14f8f82 100644 --- a/RCTAppleHealthKit/RCTAppleHealthKit+Queries.h +++ b/RCTAppleHealthKit/RCTAppleHealthKit+Queries.h @@ -36,6 +36,7 @@ endDate:(NSDate *)endDate ascending:(BOOL)asc limit:(NSUInteger)lim + gap:(NSString *)gap completion:(void (^)(NSArray *, NSError *))completionHandler; diff --git a/RCTAppleHealthKit/RCTAppleHealthKit+Queries.m b/RCTAppleHealthKit/RCTAppleHealthKit+Queries.m index ff55ed87e8c00482f8690c3e376bbb021b3972d0..721f04f0ccbb00d666ff1cf99df2b820c937ad90 100644 --- a/RCTAppleHealthKit/RCTAppleHealthKit+Queries.m +++ b/RCTAppleHealthKit/RCTAppleHealthKit+Queries.m @@ -93,7 +93,13 @@ NSString *uuid = sample.UUID.UUIDString; NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:sample.metadata options:NSJSONWritingPrettyPrinted error:&error]; + NSDictionary *metaDict; + if(sample.metadata == nil){ + metaDict = [[NSDictionary alloc] init]; + }else{ + metaDict = sample.metadata; + } + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:metaDict options:NSJSONWritingPrettyPrinted error:&error]; NSString *metadata =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSDictionary *elem = @{ @@ -185,11 +191,39 @@ valueString = @"UNKNOWN"; break; } + + NSString *deviceName = sample.device.name ? sample.device.name : @""; + NSString *deviceManufacturer = sample.device.manufacturer ? sample.device.manufacturer : @""; + NSString *deviceHardwareVer = sample.device.hardwareVersion ? sample.device.hardwareVersion : @""; + NSString *deviceSoftwareVer = sample.device.softwareVersion ? sample.device.softwareVersion : @""; + + NSString *sourceName = sample.sourceRevision.source.name; + NSString *sourceId = sample.sourceRevision.source.bundleIdentifier; + + NSString *uuid = sample.UUID.UUIDString; + + NSError *error; + NSDictionary *metaDict; + if(sample.metadata == nil){ + metaDict = [[NSDictionary alloc] init]; + }else{ + metaDict = sample.metadata; + } + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:metaDict options:NSJSONWritingPrettyPrinted error:&error]; + NSString *metadata =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSDictionary *elem = @{ @"value" : valueString, @"startDate" : startDateString, @"endDate" : endDateString, + @"deviceName" : deviceName, + @"deviceManufacturer" : deviceManufacturer, + @"deviceHardware" : deviceHardwareVer, + @"deviceSoftware" : deviceSoftwareVer, + @"sourceName" : sourceName, + @"sourceId" : sourceId, + @"uuid" : uuid, + @"metadata" : metadata }; [data addObject:elem]; @@ -393,11 +427,16 @@ endDate:(NSDate *)endDate ascending:(BOOL)asc limit:(NSUInteger)lim + gap:(NSString *)gap completion:(void (^)(NSArray *, NSError *))completionHandler { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *interval = [[NSDateComponents alloc] init]; - interval.day = 1; + if([gap isEqual: @"hour"]){ + interval.hour = 1; + }else { + interval.day = 1; + } NSDateComponents *anchorComponents = [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; diff --git a/RCTAppleHealthKit/RCTAppleHealthKit.m b/RCTAppleHealthKit/RCTAppleHealthKit.m index dbe76450fc3eead55c60f3cff62f2fd8e642abb5..ba05b47c84e6ebb423024f42eb590ff8e2ce0b33 100644 --- a/RCTAppleHealthKit/RCTAppleHealthKit.m +++ b/RCTAppleHealthKit/RCTAppleHealthKit.m @@ -105,6 +105,11 @@ RCT_EXPORT_METHOD(getStepCount:(NSDictionary *)input callback:(RCTResponseSender [self fitness_getStepCountOnDay:input callback:callback]; } +RCT_EXPORT_METHOD(getStepCountSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback) +{ + [self fitness_geStepSamples:input callback:callback]; +} + RCT_EXPORT_METHOD(getDailyStepCountSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback) { [self fitness_getDailyStepSamples:input callback:callback];