From c2cb0f2dc6f0994a09e75fe9e87f831e9fd6bf08 Mon Sep 17 00:00:00 2001 From: 20150024 Date: Mon, 27 Nov 2017 18:27:57 +0800 Subject: [PATCH] =?UTF-8?q?HA-52=20=E8=AA=BF=E6=95=B4metadata=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=B7,=20=E8=AA=BF=E6=95=B4=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E8=A1=80=E5=A3=93=E3=80=81=E7=9D=A1=E7=9C=A0=E3=80=81=E6=AD=A5?= =?UTF-8?q?=E6=95=B8=E7=9A=84=E5=9B=9E=E5=82=B3=E5=80=BC,=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=8F=83=E6=95=B8=E6=94=B9=E8=AE=8A=E6=AD=A5=E6=95=B8?= =?UTF-8?q?interval?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RCTAppleHealthKit+Methods_Fitness.h | 1 + .../RCTAppleHealthKit+Methods_Fitness.m | 36 ++++++++++++++++ .../RCTAppleHealthKit+Methods_Vitals.m | 29 +++++++++++++ RCTAppleHealthKit/RCTAppleHealthKit+Queries.h | 1 + RCTAppleHealthKit/RCTAppleHealthKit+Queries.m | 43 ++++++++++++++++++- RCTAppleHealthKit/RCTAppleHealthKit.m | 5 +++ 6 files changed, 113 insertions(+), 2 deletions(-) diff --git a/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.h b/RCTAppleHealthKit/RCTAppleHealthKit+Methods_Fitness.h index 60a9c6b..108450c 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 5406c57..04c19d3 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 74c53cb..500fafb 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 a1653a2..756f403 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 ff55ed8..721f04f 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 dbe7645..ba05b47 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]; -- 2.26.2