README.md 32.6 KB
Newer Older
Greg Wilson's avatar
Greg Wilson committed
1

Terrillo Walls's avatar
Terrillo Walls committed
2 3
# React Native Apple Healthkit
A React Native bridge module for interacting with [Apple Healthkit] data.
Greg Wilson's avatar
Greg Wilson committed
4

Greg Wilson's avatar
Greg Wilson committed
5
## Table of Contents
Greg Wilson's avatar
Greg Wilson committed
6
  * [Getting Started](#getting-started)
Greg Wilson's avatar
Greg Wilson committed
7
    * [Installation](#installation)
Greg Wilson's avatar
Greg Wilson committed
8 9 10 11
    * [Usage](#usage)
  * [Documentation](#documentation)
    * [Permissions](#permissions)
    * [Methods](#methods)
Greg Wilson's avatar
Greg Wilson committed
12
      * [isAvailable](#isavailable)
Terrillo Walls's avatar
Terrillo Walls committed
13
      * [initHealthKit](#initHealthKit)
Greg Wilson's avatar
Greg Wilson committed
14 15
      * [getBiologicalSex](#getbiologicalsex)
      * [getDateOfBirth](#getdateofbirth)
Greg Wilson's avatar
Greg Wilson committed
16
      * [getStepCount](#getstepcount)
Greg Wilson's avatar
Greg Wilson committed
17
      * [getDailyStepCountSamples](#getdailystepcountsamples)
18
      * [initStepCountObserver](#initstepcountobserver)
Greg Wilson's avatar
Greg Wilson committed
19
      * [saveSteps](#savesteps)
Greg Wilson's avatar
Greg Wilson committed
20 21 22
      * [getDistanceWalkingRunning](#getdistancewalkingrunning)
      * [getDistanceCycling](#getdistancecycling)
      * [getFlightsClimbed](#getflightsclimbed)
Greg Wilson's avatar
Greg Wilson committed
23
      * [getLatestWeight](#getlatestweight)
Greg Wilson's avatar
Greg Wilson committed
24
      * [getWeightSamples](#getweightsamples)
Greg Wilson's avatar
Greg Wilson committed
25 26
      * [saveWeight](#saveweight)
      * [getLatestHeight](#getlatestheight)
Greg Wilson's avatar
Greg Wilson committed
27
      * [getHeightSamples](#getheightsamples)
Greg Wilson's avatar
Greg Wilson committed
28 29 30 31 32
      * [saveHeight](#saveheight)
      * [getLatestBmi](#getlatestbmi)
      * [saveBmi](#savebmi)
      * [getLatestBodyFatPercentage](#getlatestbodyfatpercentage)
      * [getLatestLeanBodyMass](#getlatestleanbodymass)
Daniele Volpi's avatar
Daniele Volpi committed
33 34 35 36 37
      * [getHeartRateSamples](#getheartratesamples)
      * [getBodyTemperatureSamples](#getbodytemperaturesamples)
      * [getBloodPressureSamples](#getbloodpressuresamples)
      * [getRespiratoryRateSamples](#getrespiratoryratesamples)
      * [getBloodGlucoseSamples](#getbloodglucosesamples)
38
      * [getSleepSamples](#getsleepsamples)
skleest's avatar
skleest committed
39
      * [saveMindfulSession](#saveMindfulSession)
40

Terrillo Walls's avatar
Terrillo Walls committed
41
## References
Terrillo Walls's avatar
Terrillo Walls committed
42
- Apple Healthkit Documentation [https://developer.apple.com/Healthkit/](https://developer.apple.com/Healthkit/)
Greg Wilson's avatar
Greg Wilson committed
43

Greg Wilson's avatar
Greg Wilson committed
44 45
## Getting started

Greg Wilson's avatar
Greg Wilson committed
46 47
###  Installation

Terrillo Walls's avatar
Terrillo Walls committed
48
Install the [rn-apple-healthkit] package from npm:
Greg Wilson's avatar
Greg Wilson committed
49

Terrillo Walls's avatar
Terrillo Walls committed
50
- Run `npm install rn-apple-healthkit --save`
Terrillo Walls's avatar
Terrillo Walls committed
51
- Run `react-native link rn-apple-healthkit`
Greg Wilson's avatar
Greg Wilson committed
52

Terrillo Walls's avatar
Terrillo Walls committed
53 54 55 56 57 58 59
Update `info.plist` in your React Native project
```
<key>NSHealthShareUsageDescription</key>
<string>Read and understand health data.</string>
<key>NSHealthUpdateUsageDescription</key>
<string>Share workout data with other apps.</string>
```
60

Terrillo Walls's avatar
Terrillo Walls committed
61
### Manual Installation
Greg Wilson's avatar
Greg Wilson committed
62

Terrillo Walls's avatar
Terrillo Walls committed
63 64
1. Run `npm install rn-apple-healthkit --save`
2. In XCode, in the project navigator, right click `Libraries``Add Files to [your project's name]`
Terrillo Walls's avatar
Terrillo Walls committed
65
3. Go to `node_modules``rn-apple-healthkit` and add `RCTAppleHealthkit.xcodeproj`
Terrillo Walls's avatar
Terrillo Walls committed
66 67 68 69 70
4. In XCode, in the project navigator, select your project. Add `libRCTAppleHealthkit.a` to your project's `Build Phases``Link Binary With Libraries`
5. Click `RCTAppleHealthkit.xcodeproj` in the project navigator and go the `Build Settings` tab. Make sure 'All' is toggled on (instead of 'Basic'). In the `Search Paths` section, look for `Header Search Paths` and make sure it contains both `$(SRCROOT)/../../react-native/React` and `$(SRCROOT)/../../../React` - mark both as `recursive`.
6. Enable Healthkit in your application's `Capabilities`
![Alt text](/examples/images/Capabilities_Healthkit.png "Xcode Capabilities Section")
7. Compile and run
Greg Wilson's avatar
Greg Wilson committed
71

Greg Wilson's avatar
Greg Wilson committed
72
### Usage
Greg Wilson's avatar
Greg Wilson committed
73

Terrillo Walls's avatar
Terrillo Walls committed
74
Just `import` the `rn-apple-healthkit` module and you're ready to go!
Terrillo Walls's avatar
Terrillo Walls committed
75

Greg Wilson's avatar
Greg Wilson committed
76
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
77
import AppleHealthkit from 'rn-apple-healthkit';
Greg Wilson's avatar
Greg Wilson committed
78

Greg Wilson's avatar
Greg Wilson committed
79
let options = {
Greg Wilson's avatar
Greg Wilson committed
80
    permissions: {
Greg Wilson's avatar
Greg Wilson committed
81 82
        read: ["Height", "Weight", "StepCount", "DateOfBirth", "BodyMassIndex"],
        write: ["Weight", "StepCount", "BodyMassIndex"]
Greg Wilson's avatar
Greg Wilson committed
83 84
    }
};
Terrillo Walls's avatar
Terrillo Walls committed
85
AppleHealthKit.isAvailable((err: Object, available: boolean) => {
Terrillo Walls's avatar
Terrillo Walls committed
86 87 88 89 90 91 92
  AppleHealthkit.initHealthKit(options: Object, (err: Object, results: Object) => {
    if (err) {
      console.log("error initializing Healthkit: ", err);
      return;
    }
    // Healthkit initialized...
  });
Greg Wilson's avatar
Greg Wilson committed
93 94 95 96
});

```

Terrillo Walls's avatar
Terrillo Walls committed
97
When the module has been successfully initialized you can read and write Healthkit data
Greg Wilson's avatar
Greg Wilson committed
98 99

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
100
import AppleHealthkit from 'rn-apple-healthkit';
Greg Wilson's avatar
Greg Wilson committed
101

Terrillo Walls's avatar
Terrillo Walls committed
102
AppleHealthkit.initHealthKit(null: Object, (err: string, results: Object) => {
Greg Wilson's avatar
Greg Wilson committed
103

Terrillo Walls's avatar
Terrillo Walls committed
104
  ...
Greg Wilson's avatar
Greg Wilson committed
105

Terrillo Walls's avatar
Terrillo Walls committed
106
  AppleHealthkit.getLatestWeight(null, (err: Object, weight: Object) => {
Terrillo Walls's avatar
Terrillo Walls committed
107 108 109 110
      if(err){
          console.log("error getting current weight: ", err);
          return;
      }
Terrillo Walls's avatar
Terrillo Walls committed
111
      // use weight.value
Terrillo Walls's avatar
Terrillo Walls committed
112 113 114 115
  });

  ...

Terrillo Walls's avatar
Terrillo Walls committed
116 117 118 119
  let options = {
    value: 200
  };
  AppleHealthkit.saveWeight(options: Object, (err: Object, results: Object) => {
Terrillo Walls's avatar
Terrillo Walls committed
120
      if (err) {
Terrillo Walls's avatar
Terrillo Walls committed
121
          console.log("error saving weight to Healthkit: ", err);
Terrillo Walls's avatar
Terrillo Walls committed
122 123 124 125 126 127
          return;
      }
      // weight successfully saved
  });

}
Greg Wilson's avatar
Greg Wilson committed
128 129 130


```
Greg Wilson's avatar
Greg Wilson committed
131 132


Greg Wilson's avatar
Greg Wilson committed
133 134
## Documentation

Terrillo Walls's avatar
Terrillo Walls committed
135
### Permissions
Greg Wilson's avatar
Greg Wilson committed
136

Terrillo Walls's avatar
Terrillo Walls committed
137
The available Healthkit permissions to use with `initHealthKit`
Greg Wilson's avatar
Greg Wilson committed
138

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
| Permission             | Healthkit Identifier Type                                                                                                                                          | Read | Write |
|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|-------|
| ActiveEnergyBurned     | [HKQuantityTypeIdentifierActiveEnergyBurned](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifieractiveenergyburned?language=objc)             | ✓    | ✓     |
| AppleExerciseTime      | [HKQuantityTypeIdentifierAppleExerciseTime](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierappleexercisetime?language=objc)               | ✓    |       |
| BasalEnergyBurned      | [HKQuantityTypeIdentifierBasalEnergyBurned](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierbasalenergyburned?language=objc)               | ✓    | ✓     |
| BiologicalSex          | [HKCharacteristicTypeIdentifierBiologicalSex](https://developer.apple.com/reference/Healthkit/hkcharacteristictypeidentifierbiologicalsex?language=objc)           | ✓    |       |
| BloodGlucose           | [HKQuantityTypeIdentifierBloodGlucose](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierbloodglucose?language=objc)                         | ✓    |       |
| BodyMassIndex          | [HKQuantityTypeIdentifierBodyMassIndex](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierbodymassindex?language=objc)                       | ✓    | ✓     |
| BodyTemperature        | [HKQuantityTypeIdentifierBodyTemperature](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierbodytemperature?language=objc)                   | ✓    |       |
| DateOfBirth            | [HKCharacteristicTypeIdentifierDateOfBirth](https://developer.apple.com/reference/Healthkit/hkcharacteristictypeidentifierdateofbirth?language=objc)               | ✓    |       |
| DietaryEnergy          | [HKQuantityTypeIdentifierDietaryEnergyConsumed](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierdietaryenergyconsumed?language=objc)       | ✓    | ✓     |
| DistanceCycling        | [HKQuantityTypeIdentifierDistanceCycling](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierdistancecycling?language=objc)                   | ✓    | ✓     |
| DistanceWalkingRunning | [HKQuantityTypeIdentifierDistanceWalkingRunning](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierdistancewalkingrunning?language=objc)     | ✓    | ✓     |
| FlightsClimbed         | [HKQuantityTypeIdentifierFlightsClimbed](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierflightsclimbed?language=objc)                     | ✓    | ✓     |
| HeartRate              | [HKQuantityTypeIdentifierHeartRate](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierheartrate?language=objc)                               | ✓    |       |
| Height                 | [HKQuantityTypeIdentifierHeight](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierheight?language=objc)                                     | ✓    | ✓     |
| LeanBodyMass           | [HKQuantityTypeIdentifierLeanBodyMass](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierleanbodymass?language=objc)                         | ✓    | ✓     |
| MindfulSession         | [HKCategoryTypeIdentifierMindfulSession](https://developer.apple.com/reference/healthkit/hkcategorytypeidentifiermindfulsession?language=objc)                     |      |  ✓    |
| NikeFuel               | [HKQuantityTypeIdentifierNikeFuel](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifiernikefuel?language=objc)                                 | ✓    |       |
| RespiratoryRate        | [HKQuantityTypeIdentifierRespiratoryRate](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierrespiratoryrate?language=objc)                   | ✓    |       |
| SleepAnalysis          | [HKCategoryTypeIdentifierSleepAnalysis](https://developer.apple.com/reference/Healthkit/hkcategorytypeidentifiersleepanalysis?language=objc)                       | ✓    |       |
| StepCount              | [HKQuantityTypeIdentifierStepCount](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierstepcount?language=objc)                               | ✓    | ✓     |
| Steps                  | [HKQuantityTypeIdentifierSteps](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifiersteps?language=objc)                                       | ✓    | ✓     |
| Weight                 | [HKQuantityTypeIdentifierBodyMass](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierbodymass?language=objc)                                 | ✓    | ✓     |
| BloodPressureDiastolic | [HKQuantityTypeIdentifierBloodPressureDiastolic](https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifierbloodpressurediastolic?language=objc) | ✓    | ✓     |
| BloodPressureSystolic  | [HKQuantityTypeIdentifierBloodPressureSystolic](https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifierbloodpressuresystolic?language=objc)   | ✓    | ✓     |
Terrillo Walls's avatar
Terrillo Walls committed
165

Terrillo Walls's avatar
Terrillo Walls committed
166
These permissions are exported as constants of the `rn-apple-healthkit` module.
Greg Wilson's avatar
Greg Wilson committed
167 168 169 170 171 172 173 174 175

```javascript
import AppleHealthKit from 'react-native-apple-healthkit';

...

// get the available permissions from AppleHealthKit.Constants object
const PERMS = AppleHealthKit.Constants.Permissions;

Greg Wilson's avatar
Greg Wilson committed
176
// setup healthkit read/write permissions using PERMS
Greg Wilson's avatar
Greg Wilson committed
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
const healthKitOptions = {
    permissions: {
        read:  [
            PERMS.StepCount,
            PERMS.Height,
        ],
        write: [
            PERMS.StepCount
        ],
    }
};

...
```

Greg Wilson's avatar
Greg Wilson committed
192

Greg Wilson's avatar
Greg Wilson committed
193 194
Options
-------
Greg Wilson's avatar
Greg Wilson committed
195

196
#### **`isAvailable`**
Terrillo Walls's avatar
Terrillo Walls committed
197
Check if Healthkit is available on the device.
Greg Wilson's avatar
Greg Wilson committed
198
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
199
import AppleHealthkit from 'rn-apple-healthkit';
Terrillo Walls's avatar
Terrillo Walls committed
200

Terrillo Walls's avatar
Terrillo Walls committed
201 202
AppleHealthkit.isAvailable((err: Object, available: boolean) => {
    if (available) {
Greg Wilson's avatar
Greg Wilson committed
203 204 205 206
        // ...
    }
});
```
Greg Wilson's avatar
Greg Wilson committed
207
___
Greg Wilson's avatar
Greg Wilson committed
208

Terrillo Walls's avatar
Terrillo Walls committed
209
#### **`initHealthKit`**
Terrillo Walls's avatar
Terrillo Walls committed
210
Initialize Healthkit. This will show the Healthkit permissions prompt for any read/write permissions set in the required `options` object.
Greg Wilson's avatar
Greg Wilson committed
211

212
Due to Apple's privacy model if an app user has previously denied a specific permission then they can not be prompted again for that same permission. The app user would have to go into the Apple Health app and grant the permission to your react-native app under *sources* tab.
Greg Wilson's avatar
Greg Wilson committed
213

Terrillo Walls's avatar
Terrillo Walls committed
214
For any data that is read from Healthkit the status/error is the same for both. This privacy restriction results in having no knowledge of whether the permission was denied (make sure it's added to the permissions options object), or the data for the specific request was nil (ex. no steps recorded today).
Greg Wilson's avatar
Greg Wilson committed
215

Terrillo Walls's avatar
Terrillo Walls committed
216
For any data written to Healthkit an authorization error can be caught. If an authorization error occurs you can prompt the user to set the specific permission or add the permission to the options object if not present.
Greg Wilson's avatar
Greg Wilson committed
217

Terrillo Walls's avatar
Terrillo Walls committed
218
If new read/write permissions are added to the options object then the app user will see the Healthkit permissions prompt with the new permissions to allow.
Greg Wilson's avatar
Greg Wilson committed
219

Terrillo Walls's avatar
Terrillo Walls committed
220
`initHealthKit` requires an options object with Healthkit permission settings
Greg Wilson's avatar
Greg Wilson committed
221
```javascript
Greg Wilson's avatar
Greg Wilson committed
222
let options = {
Greg Wilson's avatar
Greg Wilson committed
223
    permissions: {
Greg Wilson's avatar
Greg Wilson committed
224 225
        read: ["Height", "Weight", "StepCount", "DateOfBirth", "BodyMassIndex"],
        write: ["Weight", "StepCount", "BodyMassIndex"]
Greg Wilson's avatar
Greg Wilson committed
226 227
    }
};
Greg Wilson's avatar
Greg Wilson committed
228
```
Greg Wilson's avatar
Greg Wilson committed
229

Greg Wilson's avatar
Greg Wilson committed
230
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
231
AppleHealthkit.initHealthKit(options: Object, (err: string, results: Object) => {
Terrillo Walls's avatar
Terrillo Walls committed
232
    if (err) {
Terrillo Walls's avatar
Terrillo Walls committed
233
        console.log("error initializing Healthkit: ", err);
Greg Wilson's avatar
Greg Wilson committed
234 235
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
236 237
    // Healthkit is initialized...
    // now safe to read and write Healthkit data...
Greg Wilson's avatar
Greg Wilson committed
238 239 240
});
```

Greg Wilson's avatar
Greg Wilson committed
241 242
___

Greg Wilson's avatar
Greg Wilson committed
243
#### **`getBiologicalSex`**
Greg Wilson's avatar
Greg Wilson committed
244
Get the biological sex (gender). If the `BiologicalSex` read permission is missing or the user has denied it then the value will be `unknown`. The possible values are:
Greg Wilson's avatar
Greg Wilson committed
245

Greg Wilson's avatar
Greg Wilson committed
246 247 248 249 250 251 252 253
| Value   | HKBiologicalSex       |
|---------|-----------------------|
| unknown | HKBiologicalSexNotSet |
| male    | HKBiologicalSexMale   |
| female  | HKBiologicalSexFemale |
| other   | HKBiologicalSexOther  |

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
254 255 256
AppleHealthkit.getBiologicalSex(null, (err: Object, results: Object) => {
    if (this._handleHealthkitError(err, 'getBiologicalSex')) {
      return;
Greg Wilson's avatar
Greg Wilson committed
257
    }
Terrillo Walls's avatar
Terrillo Walls committed
258
    console.log(results)
Greg Wilson's avatar
Greg Wilson committed
259 260 261
});
```

Terrillo Walls's avatar
Terrillo Walls committed
262 263 264 265 266 267
```javascript
{
	value: 'female',
}
```

Greg Wilson's avatar
Greg Wilson committed
268 269
___

Greg Wilson's avatar
Greg Wilson committed
270
#### **`getDateOfBirth`**
271
Get the date of birth.
Greg Wilson's avatar
Greg Wilson committed
272

Greg Wilson's avatar
Greg Wilson committed
273
On success, the callback function will be provided with a `res` object containing dob `value: string` (ISO timestamp), and `age: number` (age in years):
Terrillo Walls's avatar
Terrillo Walls committed
274 275 276 277 278 279 280 281 282
```javascript
AppleHealthkit.getDateOfBirth(null, (err: Object, results: Object) => {
    if (this._handleHealthkitError(err, 'getDateOfBirth')) {
        return;
    }
    console.log(results)
});
```

Greg Wilson's avatar
Greg Wilson committed
283
```javascript
284 285 286
{
	value: '1986-09-01T00:00:00.000-0400',
	age: 29
287 288 289
}
```

Greg Wilson's avatar
Greg Wilson committed
290 291
___

Greg Wilson's avatar
Greg Wilson committed
292
#### **`getStepCount`**
293
Get the aggregated total steps for a specific day (starting and ending at midnight).
Greg Wilson's avatar
Greg Wilson committed
294

295
An optional options object may be provided containing `date` field representing the selected day. If `date` is not set or an options object is not provided then the current day will be used.
Greg Wilson's avatar
Greg Wilson committed
296
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
297
let d = new Date(2016,1,1);
Greg Wilson's avatar
Greg Wilson committed
298 299 300 301 302
let options = {
    date: d.toISOString()
};
```

Greg Wilson's avatar
Greg Wilson committed
303
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
304 305
AppleHealthkit.getStepCount(options: Object, (err: Object, results: Object) => {
    if (this._handleHealthkitError(err, 'getStepCount')) {
Greg Wilson's avatar
Greg Wilson committed
306 307
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
308
    console.log(results)
Greg Wilson's avatar
Greg Wilson committed
309 310 311
});
```

Terrillo Walls's avatar
Terrillo Walls committed
312 313 314 315 316 317
```javascript
{
	value: 213,
}
```

Greg Wilson's avatar
Greg Wilson committed
318 319
___

Greg Wilson's avatar
Greg Wilson committed
320
#### **`getDailyStepCountSamples`**
321
Get the total steps per day over a specified date range.
Greg Wilson's avatar
Greg Wilson committed
322

Greg Wilson's avatar
Greg Wilson committed
323
`getDailyStepCountSamples` accepts an options object containing required *`startDate: ISO8601Timestamp`* and optional *`endDate: ISO8601Timestamp`*. If `endDate` is not provided it will default to the current time
Greg Wilson's avatar
Greg Wilson committed
324 325
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
326 327
    startDate: (new Date(2016,1,1)).toISOString() // required
    endDate:   (new Date()).toISOString() // optional; default now
Greg Wilson's avatar
Greg Wilson committed
328 329
};
```
Terrillo Walls's avatar
Terrillo Walls committed
330 331 332 333 334 335 336 337 338 339

```javascript
 AppleHealthkit.getDailyStepCountSamples(options: Object, (err: Object, results: Array<Object>) => {
    if (this._handleHealthkitError(err, 'getDailyStepCountSamples')) {
        return;
    }
    console.log(results)
});
```

Greg Wilson's avatar
Greg Wilson committed
340
The function will be called with an array of elements. Each element is an object containing `value`, `startDate`, and `endDate` fields:
Greg Wilson's avatar
Greg Wilson committed
341
```javascript
342
[
Greg Wilson's avatar
Greg Wilson committed
343 344 345 346 347 348
  { value: 8, startDate: '2016-07-09T00:00:00.000-0400', endDate: '2016-07-10T00:00:00.000-0400' },
  { value: 1923, startDate: '2016-07-08T00:00:00.000-0400', endDate: '2016-07-09T00:00:00.000-0400' },
  { value: 1802, startDate: '2016-07-07T00:00:00.000-0400', endDate: '2016-07-08T00:00:00.000-0400' },
]
```

Greg Wilson's avatar
Greg Wilson committed
349 350
___

351 352 353
#### **`initStepCountObserver`**
Setup an HKObserverQuery for step count (HKQuantityTypeIdentifierStepCount) that will
trigger an event listenable on react-native `NativeAppEventEmitter` when the
Terrillo Walls's avatar
Terrillo Walls committed
354
Healthkit step count has changed.
Greg Wilson's avatar
Greg Wilson committed
355

356 357 358 359 360
The `initStepCountObserver` method must be called before adding a listener to
NativeAppEventEmitter. After the step count observer has been initialized you can
listen to the NativeAppEventEmitter `change:steps` event and re-fetch relevent
step count data in the event handler.

Terrillo Walls's avatar
Terrillo Walls committed
361
The `initStepCountObserver` method should be called after Healthkit has been
Terrillo Walls's avatar
Terrillo Walls committed
362
successfully initialized (AppleHealthkit.initHealthKit has been called without
363
error).
364 365

```javascript
366 367 368 369 370 371
// import NativeAppEventEmitter from react-native
import {
  Navigator,
  View,
  NativeAppEventEmitter,
} from 'react-native';
Terrillo Walls's avatar
Terrillo Walls committed
372
```
373 374


Terrillo Walls's avatar
Terrillo Walls committed
375
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
376 377
AppleHealthkit.initHealthKit(HKOPTIONS, (err, res) => {
  if (this._handleHKError(err, 'initHealthKit')) {
378 379 380 381
    return;
  }

  // initialize the step count observer
Terrillo Walls's avatar
Terrillo Walls committed
382
  AppleHealthkit.initStepCountObserver({}, () => {});
383 384 385 386 387 388 389 390 391 392 393 394 395

  // add event listener for 'change:steps' and handle the
  // event in the event handler function.
  //
  // when adding a listener, a 'subscription' object is
  // returned that must be used to remove the listener
  // when the component unmounts. The subscription object
  // must be accessible to any function/method/instance
  // that will be unsubscribing from the event.
  this.sub = NativeAppEventEmitter.addListener(
    'change:steps',
    (evt) => {
      // a 'change:steps' event has been received. step
Terrillo Walls's avatar
Terrillo Walls committed
396
      // count data should be re-fetched from Healthkit.
397
      this._fetchStepCountData();
398
    }
399
  );
Greg Wilson's avatar
Greg Wilson committed
400

Terrillo Walls's avatar
Terrillo Walls committed
401 402
  // other tasks to perform after Healthkit has been
  // initialized (fetch relevant Healthkit data).
Greg Wilson's avatar
Greg Wilson committed
403
  this._fetchStepCountData();
Terrillo Walls's avatar
Terrillo Walls committed
404
  this._fetchOtherRelevantHealthkitData();
Greg Wilson's avatar
Greg Wilson committed
405
  // ...
406
});
407 408 409 410 411

...

// when the component where the listener was added unmounts
// (or whenever the listener should be removed), call the
Greg Wilson's avatar
Greg Wilson committed
412
// 'remove' method of the subscription object.
413 414 415
componentWillUnmount() {
  this.sub.remove();
}
416 417 418 419
```

___

Greg Wilson's avatar
Greg Wilson committed
420
#### **`saveSteps`**
Greg Wilson's avatar
Greg Wilson committed
421
Save a step count sample.
Greg Wilson's avatar
Greg Wilson committed
422

Greg Wilson's avatar
Greg Wilson committed
423
A step count sample represents the number of steps during a specific period of time. A sample should be a precise as possible, with startDate and endDate representing the range of time the steps were taken in.
Greg Wilson's avatar
Greg Wilson committed
424 425 426

`saveSteps` accepts an options object containing required *`value: number`*, *`startDate: ISO8601Timestamp`*, and *`endDate: ISO8601Timestamp`*.
```javascript
427
// startDate and endDate are 30 minutes apart.
Terrillo Walls's avatar
Terrillo Walls committed
428
// this means the step count value occurred within those 30 minutes.
Greg Wilson's avatar
Greg Wilson committed
429
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
430 431 432
  value: 100,
  startDate: (new Date(2016,6,2,6,0,0)).toISOString(),
  endDate: (new Date(2016,6,2,6,30,0)).toISOString()
Greg Wilson's avatar
Greg Wilson committed
433 434 435 436
};
```

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
437 438 439 440 441
AppleHealthkit.saveSteps(options, (err, res) => {
  if (this._handleHKError(err, 'saveSteps')) {
    return;
  }
  // step count sample successfully saved
Greg Wilson's avatar
Greg Wilson committed
442 443 444 445 446
});
```

___

Greg Wilson's avatar
Greg Wilson committed
447
#### **`getDistanceWalkingRunning`**
448
Get the total distance walking/running on a specific day.
Greg Wilson's avatar
Greg Wilson committed
449

Greg Wilson's avatar
Greg Wilson committed
450
`getDistanceWalkingRunning` accepts an options object containing optional *`date: ISO8601Timestamp`* and *`unit: string`*. If `date` is not provided it will default to the current time. `unit` defaults to `meter`.
451

Greg Wilson's avatar
Greg Wilson committed
452 453
```javascript
let options = {
454 455
  unit: 'mile', // optional; default 'meter'
  date: (new Date(2016,5,1)).toISOString(), // optional; default now
Greg Wilson's avatar
Greg Wilson committed
456
};
Terrillo Walls's avatar
Terrillo Walls committed
457
```
Greg Wilson's avatar
Greg Wilson committed
458

Terrillo Walls's avatar
Terrillo Walls committed
459 460 461
```javascript
AppleHealthkit.getDistanceWalkingRunning(options: Object, (err: Object, results: Object) => {
    if (this._handleHKError(err, 'getDistanceWalkingRunning')) {
Greg Wilson's avatar
Greg Wilson committed
462 463
    	return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
464
    console.log(results)
Greg Wilson's avatar
Greg Wilson committed
465 466 467
});
```

468 469
```javascript
{
Terrillo Walls's avatar
Terrillo Walls committed
470
	value: 1.45,
471 472 473 474 475
	startDate: '2016-07-08T12:00:00.000-0400',
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Greg Wilson's avatar
Greg Wilson committed
476 477 478
___

#### **`getDistanceCycling`**
479
Get the total distance cycling on a specific day.
Greg Wilson's avatar
Greg Wilson committed
480

Greg Wilson's avatar
Greg Wilson committed
481
`getDistanceCycling` accepts an options object containing optional *`date: ISO8601Timestamp`* and *`unit: string`*. If `date` is not provided it will default to the current time. `unit` defaults to `meter`
Greg Wilson's avatar
Greg Wilson committed
482 483
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
484 485
  unit: 'mile', // optional; default 'meter'
  date: (new Date(2016,5,1)).toISOString(), // optional; default now
Greg Wilson's avatar
Greg Wilson committed
486 487 488 489
};
```

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
490 491
AppleHealthkit.getDistanceCycling(options: Object, (err: Object, results: Object) => {
    if (err) {
Greg Wilson's avatar
Greg Wilson committed
492 493
    	return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
494
    console.log(results)
Greg Wilson's avatar
Greg Wilson committed
495 496 497
});
```

Terrillo Walls's avatar
Terrillo Walls committed
498 499 500 501 502 503 504 505
```javascript
{
	value: 11.45,
	startDate: '2016-07-08T12:00:00.000-0400',
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Greg Wilson's avatar
Greg Wilson committed
506 507 508
___

#### **`getFlightsClimbed`**
509
get the total flights climbed (1 flight is ~10ft of elevation) on a specific day.
Greg Wilson's avatar
Greg Wilson committed
510 511 512 513

`getFlightsClimbed` accepts an options object containing optional *`date: ISO8601Timestamp`*. if `date` is not provided it will default to the current time.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
514
    date: (new Date(2016,5,1)).toISOString(), // optional; default now
Greg Wilson's avatar
Greg Wilson committed
515 516 517 518
};
```

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
519 520 521 522 523
AppleHealthkit.getFlightsClimbed(options: Object, (err: Object, results: Object) => {
  if (err) {
    return;
  }
  console.log(results)
Greg Wilson's avatar
Greg Wilson committed
524 525 526
});
```

Terrillo Walls's avatar
Terrillo Walls committed
527 528 529 530 531 532 533 534
```javascript
{
	value: 15,
	startDate: '2016-07-08T12:00:00.000-0400',
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Greg Wilson's avatar
Greg Wilson committed
535 536
___

537
#### **`getLatestWeight`**
Greg Wilson's avatar
Greg Wilson committed
538 539
Get the most recent weight sample.

Greg Wilson's avatar
Greg Wilson committed
540
On success, the callback function will be provided with a `weight` object containing the weight `value`, and the `startDate` and `endDate` of the weight sample. *Note: startDate and endDate will be the same as weight samples are saved at a specific point in time.*
Terrillo Walls's avatar
Terrillo Walls committed
541 542

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
543 544 545 546
let options = {
  unit: 'pound'
};
```
Terrillo Walls's avatar
Terrillo Walls committed
547

Terrillo Walls's avatar
Terrillo Walls committed
548 549 550 551 552 553 554
```javascript
AppleHealthkit.getLatestWeight(options, (err: string, results: Object) => {
  if (err) {
    console.log("error getting latest weight: ", err);
    return;
  }
  console.log(results)
Terrillo Walls's avatar
Terrillo Walls committed
555 556 557
});
```

Greg Wilson's avatar
Greg Wilson committed
558 559 560
```javascript
{
	value: 200,
561
	startDate: '2016-07-08T12:00:00.000-0400',
Greg Wilson's avatar
Greg Wilson committed
562 563 564 565
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Greg Wilson's avatar
Greg Wilson committed
566 567
___

Greg Wilson's avatar
Greg Wilson committed
568 569 570 571
#### **`getWeightSamples`**
query for weight samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
572 573 574 575 576
  unit: 'pound', // optional; default 'pound'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  ascending: false,	// optional; default false
  limit:10, // optional; default no limit
Greg Wilson's avatar
Greg Wilson committed
577 578 579 580
};
```

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
581 582 583 584 585
AppleHealthkit.getWeightSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Greg Wilson's avatar
Greg Wilson committed
586 587 588
});
```

Terrillo Walls's avatar
Terrillo Walls committed
589 590 591 592 593 594 595 596
```javascript
[
  { value: 160, startDate: '2016-07-09T00:00:00.000-0400', endDate: '2016-07-10T00:00:00.000-0400' },
  { value: 161, startDate: '2016-07-08T00:00:00.000-0400', endDate: '2016-07-09T00:00:00.000-0400' },
  { value: 165, startDate: '2016-07-07T00:00:00.000-0400', endDate: '2016-07-08T00:00:00.000-0400' },
]
```

Greg Wilson's avatar
Greg Wilson committed
597 598
___

Greg Wilson's avatar
Greg Wilson committed
599
#### **`saveWeight`**
Terrillo Walls's avatar
Terrillo Walls committed
600
save a numeric weight value to Healthkit
Greg Wilson's avatar
Greg Wilson committed
601

Greg Wilson's avatar
Greg Wilson committed
602
`saveWeight` accepts an options object containing a numeric weight value:
Greg Wilson's avatar
Greg Wilson committed
603
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
604 605 606
let options = {
  value: 200
}
Greg Wilson's avatar
Greg Wilson committed
607
```
Terrillo Walls's avatar
Terrillo Walls committed
608

Greg Wilson's avatar
Greg Wilson committed
609
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
610 611 612
AppleHealthkit.saveWeight(options: Object, (err: Object, results: Object) => {
    if (err) {
        console.log("error saving weight to Healthkit: ", err);
Greg Wilson's avatar
Greg Wilson committed
613 614
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
615
    // Done
Greg Wilson's avatar
Greg Wilson committed
616 617
});
```
Greg Wilson's avatar
Greg Wilson committed
618

619 620 621
___

#### **`getLatestHeight`**
Greg Wilson's avatar
Greg Wilson committed
622 623
Get the most recent height value.

Greg Wilson's avatar
Greg Wilson committed
624
On success, the callback function will be provided with a `height` object containing the height `value`, and the `startDate` and `endDate` of the height sample. *Note: startDate and endDate will be the same as height samples are saved at a specific point in time.*
Greg Wilson's avatar
Greg Wilson committed
625 626

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
627 628
AppleHealthkit.getLatestHeight(null, (err: string, results: Object) => {
    if (err) {
629 630 631
        console.log("error getting latest height: ", err);
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
632
    console.log(results)
633 634
});
```
Greg Wilson's avatar
Greg Wilson committed
635

Terrillo Walls's avatar
Terrillo Walls committed
636 637 638 639 640 641 642 643
```javascript
{
	value: 72,
	startDate: '2016-07-08T12:00:00.000-0400',
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Greg Wilson's avatar
Greg Wilson committed
644 645
___

Greg Wilson's avatar
Greg Wilson committed
646 647 648 649
#### **`getHeightSamples`**
query for height samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
650 651 652 653 654
  unit: 'inch', // optional; default 'inch'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  ascending: false, // optional; default false
  limit:10, // optional; default no limit
Greg Wilson's avatar
Greg Wilson committed
655 656 657 658
};
```

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
659 660 661 662 663 664
AppleHealthkit.getHeightSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
});
Greg Wilson's avatar
Greg Wilson committed
665
```
Terrillo Walls's avatar
Terrillo Walls committed
666 667

The callback function will be called with a `samples` array containing objects with `value`, `startDate`, and `endDate` fields
Greg Wilson's avatar
Greg Wilson committed
668
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
669 670 671 672
[
	{ value: 74.02, startDate:'2016-06-29T17:55:00.000-0400', endDate:'2016-06-29T17:55:00.000-0400' },
	{ value: 74, startDate:'2016-03-12T13:22:00.000-0400', endDate:'2016-03-12T13:22:00.000-0400' },
]
Greg Wilson's avatar
Greg Wilson committed
673 674 675 676
```

___

Greg Wilson's avatar
Greg Wilson committed
677
#### **`saveHeight`**
Terrillo Walls's avatar
Terrillo Walls committed
678
save a numeric height value to Healthkit
Greg Wilson's avatar
Greg Wilson committed
679 680 681

`saveHeight` accepts an options object containing a numeric height value:
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
682 683 684
let options = {
  value: 200
}
Greg Wilson's avatar
Greg Wilson committed
685
```
Terrillo Walls's avatar
Terrillo Walls committed
686

Greg Wilson's avatar
Greg Wilson committed
687
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
688 689 690 691 692
AppleHealthkit.saveHeight(options: Object, (err: Object, results: Object) => {
  if (err) {
    return;
  }
  // height successfully saved
Greg Wilson's avatar
Greg Wilson committed
693 694 695
});
```

Greg Wilson's avatar
Greg Wilson committed
696 697 698
___

#### **`getLatestBmi`**
699
Get the most recent BMI sample.
Greg Wilson's avatar
Greg Wilson committed
700

Greg Wilson's avatar
Greg Wilson committed
701
On success, the callback function will be provided with a `bmi` object containing the BMI `value`, and the `startDate` and `endDate` of the sample. *Note: startDate and endDate will be the same as bmi samples are saved at a specific point in time.*
Terrillo Walls's avatar
Terrillo Walls committed
702 703 704 705 706 707 708 709 710 711
```javascript
AppleHealthkit.getLatestBmi(null, (err: string, results: Object) => {
    if (err) {
        console.log("error getting latest bmi data: ", err);
        return;
    }
    console.log(results)
});
```

Greg Wilson's avatar
Greg Wilson committed
712 713 714
```javascript
{
	value: 27.2,
715
	startDate: '2016-07-08T12:00:00.000-0400',
Greg Wilson's avatar
Greg Wilson committed
716 717 718 719
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

720 721
___

Greg Wilson's avatar
Greg Wilson committed
722
#### **`saveBmi`**
Terrillo Walls's avatar
Terrillo Walls committed
723
save a numeric BMI value to Healthkit
Greg Wilson's avatar
Greg Wilson committed
724 725 726

`saveBmi` accepts an options object containing a numeric BMI value:
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
727 728 729
let options = {
  value: 27.2
}
Greg Wilson's avatar
Greg Wilson committed
730 731
```
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
732 733 734 735 736
AppleHealthkit.saveBmi(options: Object, (err: Object, results: Object) => {
  if (err) {
    return;
  }
  // BMI successfully saved
Greg Wilson's avatar
Greg Wilson committed
737 738 739 740 741
});
```

___

742
#### **`getLatestBodyFatPercentage`**
Greg Wilson's avatar
Greg Wilson committed
743 744
Get the most recent body fat percentage. The percentage value is a number between 0 and 100.

Greg Wilson's avatar
Greg Wilson committed
745
On success, the callback function will be provided with a `bodyFatPercentage` object containing the body fat percentage `value`, and the `startDate` and `endDate` of the sample. *Note: startDate and endDate will be the same as bodyFatPercentage samples are saved at a specific point in time.*
Terrillo Walls's avatar
Terrillo Walls committed
746 747 748 749 750 751 752 753 754 755

```javascript
AppleHealthkit.getLatestBodyFatPercentage(null, (err: Object, results: Object) => {
  if (err) {
    return;
  }
  console.log(results)
});
```

Greg Wilson's avatar
Greg Wilson committed
756 757 758
```javascript
{
	value: 20,
759
	startDate: '2016-07-08T12:00:00.000-0400',
Greg Wilson's avatar
Greg Wilson committed
760 761 762 763
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Greg Wilson's avatar
Greg Wilson committed
764 765 766
___

#### **`getLatestLeanBodyMass`**
Greg Wilson's avatar
Greg Wilson committed
767 768
Get the most recent lean body mass. The value is a number representing the weight in pounds (lbs)

Greg Wilson's avatar
Greg Wilson committed
769
On success, the callback function will be provided with a `leanBodyMass` object containing the leanBodyMass `value`, and the `startDate` and `endDate` of the sample. *Note: startDate and endDate will be the same as leanBodyMass samples are saved at a specific point in time.*
Terrillo Walls's avatar
Terrillo Walls committed
770 771 772 773 774 775 776 777 778 779

```javascript
 AppleHealthkit.getLatestLeanBodyMass(null, (err: Object, results: Object) => {
  if (err) {
    return;
  }
  console.log(results)
});
```

Greg Wilson's avatar
Greg Wilson committed
780 781 782
```javascript
{
	value: 176,
783
	startDate: '2016-07-08T12:00:00.000-0400',
Greg Wilson's avatar
Greg Wilson committed
784 785 786 787
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

Daniele Volpi's avatar
Daniele Volpi committed
788 789 790 791 792 793
___

#### **`getHeartRateSamples`**
query for heart rate samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
794 795 796 797 798
  unit: 'bpm', // optional; default 'bpm'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  ascending: false, // optional; default false
  limit:10, // optional; default no limit
Daniele Volpi's avatar
Daniele Volpi committed
799 800 801 802 803
};
```

the callback function will be called with a `samples` array containing objects with *value*, *startDate*, and *endDate* fields
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
804 805 806 807 808
AppleHealthkit.getHeartRateSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
809 810 811
});
```

Terrillo Walls's avatar
Terrillo Walls committed
812 813 814 815 816 817 818
```javascript
[
	{ value: 74.02, startDate:'2016-06-29T17:55:00.000-0400', endDate:'2016-06-29T17:55:00.000-0400' },
	{ value: 74, startDate:'2016-03-12T13:22:00.000-0400', endDate:'2016-03-12T13:22:00.000-0400' },
]
```

Daniele Volpi's avatar
Daniele Volpi committed
819 820 821 822 823 824
___

#### **`getBodyTemperatureSamples`**
query for body temperature samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
825 826 827 828 829
  unit: 'celsius', // optional; default 'celsius'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  ascending: false, // optional; default false
  limit:10,	// optional; default no limit
Daniele Volpi's avatar
Daniele Volpi committed
830 831 832 833 834 835 836
};
```
available units are: `'fahrenheit'`, `'celsius'`.

the callback function will be called with a `samples` array containing objects with *value*, *startDate*, and *endDate* fields.

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
837 838
AppleHealthkit.getBodyTemperatureSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
Daniele Volpi's avatar
Daniele Volpi committed
839 840
		return;
	}
Terrillo Walls's avatar
Terrillo Walls committed
841
	console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
842 843 844
});
```

Terrillo Walls's avatar
Terrillo Walls committed
845 846 847 848 849 850 851
```javascript
[
	{ value: 74.02, startDate:'2016-06-29T17:55:00.000-0400', endDate:'2016-06-29T17:55:00.000-0400' },
	{ value: 74, startDate:'2016-03-12T13:22:00.000-0400', endDate:'2016-03-12T13:22:00.000-0400' },
]
```

Daniele Volpi's avatar
Daniele Volpi committed
852 853 854 855 856 857
___

#### **`getBloodPressureSamples`**
query for blood pressure samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
858 859 860 861 862
  unit: 'mmhg',	// optional; default 'mmhg'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(),	// optional; default now
  ascending: false,	// optional; default false
  limit:10, // optional; default no limit
Daniele Volpi's avatar
Daniele Volpi committed
863 864 865 866
};
```

the callback function will be called with a `samples` array containing objects with *bloodPressureSystolicValue*, *bloodPressureDiastolicValue*, *startDate*, and *endDate* fields
Terrillo Walls's avatar
Terrillo Walls committed
867

Daniele Volpi's avatar
Daniele Volpi committed
868
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
869 870 871 872 873 874
AppleHealthkit.getBloodPressureSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
});
Daniele Volpi's avatar
Daniele Volpi committed
875
```
Terrillo Walls's avatar
Terrillo Walls committed
876

Daniele Volpi's avatar
Daniele Volpi committed
877
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
878 879 880 881
[
  { bloodPressureSystolicValue: 120, bloodPressureDiastolicValue: 81, startDate:'2016-06-29T17:55:00.000-0400', endDate:'2016-06-29T17:55:00.000-0400' },
  { bloodPressureSystolicValue: 119, bloodPressureDiastolicValue: 77, startDate:'2016-03-12T13:22:00.000-0400', endDate:'2016-03-12T13:22:00.000-0400' },
]
Daniele Volpi's avatar
Daniele Volpi committed
882 883
```

Terrillo Walls's avatar
Terrillo Walls committed
884

Daniele Volpi's avatar
Daniele Volpi committed
885 886 887 888 889 890
___

#### **`getRespiratoryRateSamples`**
query for respiratory rate samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
891 892 893 894 895
  unit: 'bpm', // optional; default 'bpm'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  ascending: false, // optional; default false
  limit:10, // optional; default no limit
Daniele Volpi's avatar
Daniele Volpi committed
896 897 898 899 900 901
};
```

the callback function will be called with a `samples` array containing objects with *value*, *startDate*, and *endDate* fields

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
902 903 904 905 906
AppleHealthkit.getRespiratoryRateSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
907 908 909 910 911 912 913 914 915
});
```

___

#### **`getBloodGlucoseSamples`**
query for blood glucose samples. the options object is used to setup a query to retrieve relevant samples.
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
916 917 918 919 920
  unit: 'mmolPerL',	// optional; default 'mmolPerL'
  startDate: (new Date(2016,4,27)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  ascending: false, // optional; default false
  limit:10,	// optional; default no limit
Daniele Volpi's avatar
Daniele Volpi committed
921 922 923 924 925 926 927
};
```
available units are: `'mmolPerL'`, `'mgPerdL'`.

the callback function will be called with a `samples` array containing objects with *value*, *startDate*, and *endDate* fields

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
928 929 930 931 932
AppleHealthkit.getBloodGlucoseSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
933 934 935
});
```

936 937 938 939 940 941 942
___

#### **`getSleepSamples`**
query for sleep samples.

each sleep sample represents a period of time with a startDate and an endDate.
the sample's value will be either `INBED` or `ASLEEP`. these values should overlap,
Greg Wilson's avatar
Greg Wilson committed
943
meaning that two (or more) samples represent a single nights sleep activity. see
Terrillo Walls's avatar
Terrillo Walls committed
944
[Healthkit SleepAnalysis] reference documentation
945 946 947 948 949 950

the options object is used to setup a query to retrieve relevant samples.
the options must contain `startDate` and may also optionally include `endDate`
and `limit` options
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
951 952 953
  startDate: (new Date(2016,10,1)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  limit:10, // optional; default no limit
954 955 956
};
```

Terrillo Walls's avatar
Terrillo Walls committed
957
The callback function will be called with a `samples` array containing objects
958 959 960
with *value*, *startDate*, and *endDate* fields

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
961 962 963 964 965
AppleHealthkit.getSleepSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results).
966 967 968
});
```

skleest's avatar
skleest committed
969 970 971 972 973 974 975
#### **`saveMindfulSession`**

each mindfulness sample represents a period of time with a startDate and an endDate.
the options must contain `startDate` and `endDate`

```javascript
let options = {
976 977
    startDate: (new Date(2016,10,1)).toISOString(), // required
    endDate: (new Date()).toISOString(), // optional; default now
skleest's avatar
skleest committed
978
};
skleest's avatar
skleest committed
979

980 981 982
```

```
skleest's avatar
minor  
skleest committed
983
AppleHealthKit.saveMindfulSession(options, (err, res) => {
984 985 986
  if (err) return {
    return
  }
skleest's avatar
skleest committed
987 988
  console.log('Mindful session saved')
});
skleest's avatar
skleest committed
989
```
Daniele Volpi's avatar
Daniele Volpi committed
990

Terrillo Walls's avatar
Terrillo Walls committed
991
> *This package is fork from [react-native-apple-Healthkit](https://github.com/GregWilson/react-native-apple-Healthkit)*