Skip to content

Commit 202a4ca

Browse files
author
Alberto Vaccari
committed
Added saveHeartRateSample to the library
1 parent 96e68af commit 202a4ca

7 files changed

+69
-0
lines changed

RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.h

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
@interface RCTAppleHealthKit (Methods_Vitals)
1111

12+
- (void)vitals_saveHeartRateSample:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
1213
- (void)vitals_getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
1314
- (void)vitals_getRestingHeartRate:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;
1415
- (void)vitals_getWalkingHeartRateAverage:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback;

RCTAppleHealthKit/RCTAppleHealthKit+Methods_Vitals.m

+20
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,26 @@
1212

1313
@implementation RCTAppleHealthKit (Methods_Vitals)
1414

15+
- (void)vitals_saveHeartRateSample:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
16+
{
17+
NSDate *timeHeartRateSampleWasTaken = [RCTAppleHealthKit dateFromOptions:input key:@"date" withDefault:[NSDate date]];
18+
double heartRateValue = [RCTAppleHealthKit doubleFromOptions:input key:@"value" withDefault:(double)60]; // Default HR is 60
19+
20+
HKQuantitySample* heartRate = [HKQuantitySample quantitySampleWithType:[HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
21+
quantity:[HKQuantity quantityWithUnit:[HKUnit unitFromString: @"count/min"] doubleValue:heartRateValue]
22+
startDate:timeHeartRateSampleWasTaken
23+
endDate:timeHeartRateSampleWasTaken];
24+
25+
// Save the HeartRate Sample to HealthKit //
26+
[self.healthStore saveObject:heartRate withCompletion:^(BOOL success, NSError *error) {
27+
if (!success) {
28+
NSLog(@"An error occured saving the heart rate sample %@. The error was: ", error);
29+
callback(@[RCTMakeError(@"An error occured saving the heart rate sample", error, nil)]);
30+
return;
31+
}
32+
callback(@[[NSNull null], @true]);
33+
}];
34+
}
1535

1636
- (void)vitals_getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback
1737
{

RCTAppleHealthKit/RCTAppleHealthKit+TypesAndPermissions.m

+3
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,9 @@ - (nullable HKObjectType *)getWritePermFromText:(nonnull NSString*) key {
370370
if ([@"BloodAlcoholContent" isEqualToString: key]) {
371371
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodAlcoholContent];
372372
}
373+
if ([@"HeartRate" isEqualToString: key]) {
374+
return [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
375+
}
373376

374377
return nil;
375378
}

RCTAppleHealthKit/RCTAppleHealthKit.m

+6
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,12 @@ + (BOOL)requiresMainQueueSetup
311311
[self getWater:input callback:callback];
312312
}
313313

314+
RCT_EXPORT_METHOD(saveHeartRateSample:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
315+
{
316+
[self _initializeHealthStore];
317+
[self vitals_saveHeartRateSample:input callback:callback];
318+
}
319+
314320
RCT_EXPORT_METHOD(getHeartRateSamples:(NSDictionary *)input callback:(RCTResponseSenderBlock)callback)
315321
{
316322
[self _initializeHealthStore];

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ they are splitted in the following categories
244244
245245
- [getBloodPressureSamples](/docs/getBloodPressureSamples.md)
246246
- [getElectrocardiogramSamples](/docs/getElectrocardiogramSamples.md)
247+
- [saveHeartRateSample](/docs/saveHeartRateSample.md)
247248
- [getHeartRateSamples](/docs/getHeartRateSamples.md)
248249
- [getHeartRateVariabilitySamples](/docs/getHeartRateVariabilitySamples.md)
249250
- [getHeartbeatSeriesSamples](/docs/getHeartbeatSeriesSamples.md)

docs/saveHeartRateSample.md

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# saveHeartRateSample
2+
3+
Save a Heart Rate sample to Healthkit
4+
5+
`saveHeartRateSample` accepts an options object containing a numeric heart rate value in Beats per minute (BPM).
6+
In the example below a heart rate sample of 72BPM is added to Healthkit.
7+
8+
Example input options:
9+
10+
```javascript
11+
let options = {
12+
value: 72, // Amount in BPM
13+
date: (new Date(2018,10,1)).toISOString(), // Optional, time when the Heart Rate was logged
14+
}
15+
```
16+
17+
Call the method:
18+
19+
```javascript
20+
AppleHealthKit.saveHeartRateSample((options: Object), (err: Object, results: boolean) => {
21+
if (err) {
22+
console.log('Error saving Heart Rate to Healthkit: ', err)
23+
return
24+
}
25+
// Heart Rate successfully saved
26+
})
27+
```
28+
29+
Example output:
30+
31+
```json
32+
1
33+
```

index.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ declare module 'react-native-health' {
197197
callback: (err: string, results: HealthValue) => void,
198198
): void
199199

200+
saveHeartRateSample(
201+
options: HealthValueOptions,
202+
callback: (error: string, result: HealthValue) => void,
203+
): void
204+
200205
getHeartRateSamples(
201206
options: HealthInputOptions,
202207
callback: (err: string, results: Array<HealthValue>) => void,

0 commit comments

Comments
 (0)