README.md 32.1 KB
Newer Older
Terrillo Walls's avatar
Terrillo Walls committed
1 2
# React Native Apple Healthkit
A React Native bridge module for interacting with [Apple Healthkit] data.
Greg Wilson's avatar
Greg Wilson committed
3

Terrillo Walls's avatar
Terrillo Walls committed
4
![Alt text](https://devimages.apple.com.edgekey.net/assets/elements/icons/Healthkit/Healthkit-64x64.png "Apple Healthkit")
Greg Wilson's avatar
Greg Wilson committed
5

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

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

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

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

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

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

Terrillo Walls's avatar
Terrillo Walls committed
54 55 56 57 58 59 60
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>
```
61

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

Terrillo Walls's avatar
Terrillo Walls committed
64 65 66 67 68 69 70 71
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]`
3. Go to `node_modules``rn-apple-Healthkit` and add `RCTAppleHealthkit.xcodeproj`
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
72

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

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

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

Greg Wilson's avatar
Greg Wilson committed
80
let options = {
Greg Wilson's avatar
Greg Wilson committed
81
    permissions: {
Greg Wilson's avatar
Greg Wilson committed
82 83
        read: ["Height", "Weight", "StepCount", "DateOfBirth", "BodyMassIndex"],
        write: ["Weight", "StepCount", "BodyMassIndex"]
Greg Wilson's avatar
Greg Wilson committed
84 85 86
    }
};

Terrillo Walls's avatar
Terrillo Walls committed
87 88 89
AppleHealthkit.initHealthkit(options: Object, (err: Object, results: Object) => {
    if (err) {
        console.log("error initializing Healthkit: ", err);
Greg Wilson's avatar
Greg Wilson committed
90 91
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
92
    // Healthkit initialized...
Greg Wilson's avatar
Greg Wilson committed
93 94 95 96 97
});


```

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

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

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

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

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

  ...

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

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


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


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

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

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

Terrillo Walls's avatar
Terrillo Walls committed
140
| Permission             | Healthkit Identifier Type                                                                                                                                      | Read | Write |
Greg Wilson's avatar
Greg Wilson committed
141
|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|------|-------|
Terrillo Walls's avatar
Terrillo Walls committed
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
| 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)                     | ✓    | ✓     |
Terrillo Walls's avatar
Terrillo Walls committed
157
| MindfulSession         | [HKCategoryTypeIdentifierMindfulSession](https://developer.apple.com/reference/healthkit/hkcategorytypeidentifiermindfulsession?language=objc)                 |      |  ✓    |
Terrillo Walls's avatar
Terrillo Walls committed
158 159 160 161 162 163 164 165
| 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)                             | ✓    | ✓     |

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

```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
175
// setup healthkit read/write permissions using PERMS
Greg Wilson's avatar
Greg Wilson committed
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
const healthKitOptions = {
    permissions: {
        read:  [
            PERMS.StepCount,
            PERMS.Height,
        ],
        write: [
            PERMS.StepCount
        ],
    }
};

...
```

Greg Wilson's avatar
Greg Wilson committed
191

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

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

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

Terrillo Walls's avatar
Terrillo Walls committed
208 209
#### **`initHealthkit`**
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
210

211
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
212

Terrillo Walls's avatar
Terrillo Walls committed
213
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
214

Terrillo Walls's avatar
Terrillo Walls committed
215
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
216

Terrillo Walls's avatar
Terrillo Walls committed
217
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
218

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

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

Greg Wilson's avatar
Greg Wilson committed
240 241
___

Greg Wilson's avatar
Greg Wilson committed
242
#### **`getBiologicalSex`**
Greg Wilson's avatar
Greg Wilson committed
243
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
244

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

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

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

Greg Wilson's avatar
Greg Wilson committed
267 268
___

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

Greg Wilson's avatar
Greg Wilson committed
272
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
273 274 275 276 277 278 279 280 281
```javascript
AppleHealthkit.getDateOfBirth(null, (err: Object, results: Object) => {
    if (this._handleHealthkitError(err, 'getDateOfBirth')) {
        return;
    }
    console.log(results)
});
```

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

Greg Wilson's avatar
Greg Wilson committed
289 290
___

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

294
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
295
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
296
let d = new Date(2016,1,1);
Greg Wilson's avatar
Greg Wilson committed
297 298 299 300 301
let options = {
    date: d.toISOString()
};
```

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

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

Greg Wilson's avatar
Greg Wilson committed
317 318
___

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

Greg Wilson's avatar
Greg Wilson committed
322
`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
323 324
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
325 326
    startDate: (new Date(2016,1,1)).toISOString() // required
    endDate:   (new Date()).toISOString() // optional; default now
Greg Wilson's avatar
Greg Wilson committed
327 328
};
```
Terrillo Walls's avatar
Terrillo Walls committed
329 330 331 332 333 334 335 336 337 338

```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
339
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
340
```javascript
341
[
Greg Wilson's avatar
Greg Wilson committed
342 343 344 345 346 347
  { 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
348 349
___

350 351 352
#### **`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
353
Healthkit step count has changed.
Greg Wilson's avatar
Greg Wilson committed
354

355 356 357 358 359
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
360 361
The `initStepCountObserver` method should be called after Healthkit has been
successfully initialized (AppleHealthkit.initHealthkit has been called without
362
error).
363 364

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


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

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

  // 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
395
      // count data should be re-fetched from Healthkit.
396
      this._fetchStepCountData();
397
    }
398
  );
Greg Wilson's avatar
Greg Wilson committed
399

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

...

// 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
411
// 'remove' method of the subscription object.
412 413 414
componentWillUnmount() {
  this.sub.remove();
}
415 416 417 418
```

___

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

Greg Wilson's avatar
Greg Wilson committed
422
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
423 424 425

`saveSteps` accepts an options object containing required *`value: number`*, *`startDate: ISO8601Timestamp`*, and *`endDate: ISO8601Timestamp`*.
```javascript
426
// startDate and endDate are 30 minutes apart.
Terrillo Walls's avatar
Terrillo Walls committed
427
// this means the step count value occurred within those 30 minutes.
Greg Wilson's avatar
Greg Wilson committed
428
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
429 430 431
  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
432 433 434 435
};
```

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

___

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

Greg Wilson's avatar
Greg Wilson committed
449
`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`.
450

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

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

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

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

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

Greg Wilson's avatar
Greg Wilson committed
480
`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
481 482
```javascript
let options = {
Terrillo Walls's avatar
Terrillo Walls committed
483 484
  unit: 'mile', // optional; default 'meter'
  date: (new Date(2016,5,1)).toISOString(), // optional; default now
Greg Wilson's avatar
Greg Wilson committed
485 486 487 488
};
```

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

Terrillo Walls's avatar
Terrillo Walls committed
497 498 499 500 501 502 503 504
```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
505 506 507
___

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

`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
513
    date: (new Date(2016,5,1)).toISOString(), // optional; default now
Greg Wilson's avatar
Greg Wilson committed
514 515 516 517
};
```

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

Terrillo Walls's avatar
Terrillo Walls committed
526 527 528 529 530 531 532 533
```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
534 535
___

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

Greg Wilson's avatar
Greg Wilson committed
539
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
540 541

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

Terrillo Walls's avatar
Terrillo Walls committed
547 548 549 550 551 552 553
```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
554 555 556
});
```

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

Greg Wilson's avatar
Greg Wilson committed
565 566
___

Greg Wilson's avatar
Greg Wilson committed
567 568 569 570
#### **`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
571 572 573 574 575
  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
576 577 578 579
};
```

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

Terrillo Walls's avatar
Terrillo Walls committed
588 589 590 591 592 593 594 595
```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
596 597
___

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

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

Greg Wilson's avatar
Greg Wilson committed
608
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
609 610 611
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
612 613
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
614
    // Done
Greg Wilson's avatar
Greg Wilson committed
615 616
});
```
Greg Wilson's avatar
Greg Wilson committed
617

618 619 620
___

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

Greg Wilson's avatar
Greg Wilson committed
623
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
624 625

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

Terrillo Walls's avatar
Terrillo Walls committed
635 636 637 638 639 640 641 642
```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
643 644
___

Greg Wilson's avatar
Greg Wilson committed
645 646 647 648
#### **`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
649 650 651 652 653
  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
654 655 656 657
};
```

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

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
667
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
668 669 670 671
[
	{ 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
672 673 674 675
```

___

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

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

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

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

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

Greg Wilson's avatar
Greg Wilson committed
700
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
701 702 703 704 705 706 707 708 709 710
```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
711 712 713
```javascript
{
	value: 27.2,
714
	startDate: '2016-07-08T12:00:00.000-0400',
Greg Wilson's avatar
Greg Wilson committed
715 716 717 718
	endDate: '2016-07-08T12:00:00.000-0400'
}
```

719 720
___

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

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

___

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

Greg Wilson's avatar
Greg Wilson committed
744
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
745 746 747 748 749 750 751 752 753 754

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

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

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

#### **`getLatestLeanBodyMass`**
Greg Wilson's avatar
Greg Wilson committed
766 767
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
768
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
769 770 771 772 773 774 775 776 777 778

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

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

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

#### **`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
793 794 795 796 797
  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
798 799 800 801 802
};
```

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
803 804 805 806 807
AppleHealthkit.getHeartRateSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
808 809 810
});
```

Terrillo Walls's avatar
Terrillo Walls committed
811 812 813 814 815 816 817
```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
818 819 820 821 822 823
___

#### **`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
824 825 826 827 828
  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
829 830 831 832 833 834 835
};
```
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
836 837
AppleHealthkit.getBodyTemperatureSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
Daniele Volpi's avatar
Daniele Volpi committed
838 839
		return;
	}
Terrillo Walls's avatar
Terrillo Walls committed
840
	console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
841 842 843
});
```

Terrillo Walls's avatar
Terrillo Walls committed
844 845 846 847 848 849 850
```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
851 852 853 854 855 856
___

#### **`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
857 858 859 860 861
  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
862 863 864 865
};
```

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
866

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

Daniele Volpi's avatar
Daniele Volpi committed
876
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
877 878 879 880
[
  { 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
881 882
```

Terrillo Walls's avatar
Terrillo Walls committed
883

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

#### **`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
890 891 892 893 894
  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
895 896 897 898 899 900
};
```

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
901 902 903 904 905
AppleHealthkit.getRespiratoryRateSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
906 907 908 909 910 911 912 913 914
});
```

___

#### **`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
915 916 917 918 919
  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
920 921 922 923 924 925 926
};
```
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
927 928 929 930 931
AppleHealthkit.getBloodGlucoseSamples(options, (err: Object, results: Array<Object>) => {
  if (err) {
    return;
  }
  console.log(results)
Daniele Volpi's avatar
Daniele Volpi committed
932 933 934
});
```

935 936 937 938 939 940 941
___

#### **`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
942
meaning that two (or more) samples represent a single nights sleep activity. see
Terrillo Walls's avatar
Terrillo Walls committed
943
[Healthkit SleepAnalysis] reference documentation
944 945 946 947 948 949

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
950 951 952
  startDate: (new Date(2016,10,1)).toISOString(), // required
  endDate: (new Date()).toISOString(), // optional; default now
  limit:10, // optional; default no limit
953 954 955
};
```

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

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

skleest's avatar
skleest committed
968 969 970 971 972 973 974
#### **`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 = {
975 976
    startDate: (new Date(2016,10,1)).toISOString(), // required
    endDate: (new Date()).toISOString(), // optional; default now
skleest's avatar
skleest committed
977
};
skleest's avatar
skleest committed
978

979 980 981
```

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

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