README.md 11.1 KB
Newer Older
Greg Wilson's avatar
Greg Wilson committed
1
# react-native-apple-healthkit
Greg Wilson's avatar
Greg Wilson committed
2 3
A React Native bridge module for interacting with [Apple HealthKit] data. 

Greg Wilson's avatar
Greg Wilson 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
#### Notice
Greg Wilson's avatar
Greg Wilson committed
7 8
> *This package is undergoing rapid development and should be considered unstable for the time being.*
> *<strong>Use at your own risk</strong>*
Greg Wilson's avatar
Greg Wilson committed
9

Greg Wilson's avatar
Greg Wilson committed
10
#### Table of Contents
Greg Wilson's avatar
Greg Wilson committed
11
  * [Getting Started](#getting-started)
Greg Wilson's avatar
Greg Wilson committed
12
    * [Installation](#installation)
Greg Wilson's avatar
Greg Wilson committed
13 14 15
    * [Usage](#usage)
  * [Documentation](#documentation)
    * [Permissions](#permissions)
Greg Wilson's avatar
Greg Wilson committed
16 17
      * [Read](#read-permissions)
      * [Write](#write-permissions)
Greg Wilson's avatar
Greg Wilson committed
18
    * [Methods](#methods)
Greg Wilson's avatar
Greg Wilson committed
19
      * [isAvailable](#isavailable)
Greg Wilson's avatar
Greg Wilson committed
20
      * [initHealthKit](#inithealthkit)
Greg Wilson's avatar
Greg Wilson committed
21
      * [getStepCountForToday](#getstepcountfortoday)
22
      * [getStepCountForDay](#getstepcountforday)
23
      * [getMultiDayStepCounts](#getmultidaystepcounts)
Greg Wilson's avatar
Greg Wilson committed
24 25 26 27 28 29 30 31
      * [getLatestWeight](#getlatestweight)
      * [saveWeight](#saveweight)
      * [getLatestHeight](#getlatestheight)
      * [saveHeight](#saveheight)
      * [getLatestBmi](#getlatestbmi)
      * [saveBmi](#savebmi)
      * [getLatestBodyFatPercentage](#getlatestbodyfatpercentage)
      * [getLatestLeanBodyMass](#getlatestleanbodymass)
Greg Wilson's avatar
Greg Wilson committed
32 33
  * [Examples](#examples)
  
Greg Wilson's avatar
Greg Wilson committed
34

Greg Wilson's avatar
Greg Wilson committed
35 36
## Getting started

Greg Wilson's avatar
Greg Wilson committed
37 38
###  Installation

Greg Wilson's avatar
Greg Wilson committed
39
Install the [react-native-apple-healthkit] package from npm:
Greg Wilson's avatar
Greg Wilson committed
40 41 42

`npm install react-native-apple-healthkit --save`

Greg Wilson's avatar
Greg Wilson committed
43
##### Xcode
Greg Wilson's avatar
Greg Wilson committed
44
  
Greg Wilson's avatar
Greg Wilson committed
45 46 47 48 49
1. In XCode, in the project navigator, right click `Libraries``Add Files to [your project's name]`
2. Go to `node_modules``react-native-apple-healthkit` and add `RCTAppleHealthKit.xcodeproj`
3. In XCode, in the project navigator, select your project. Add `libRCTAppleHealthKit.a` to your project's `Build Phases``Link Binary With Libraries`
4. 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`.
5. Compile and run
Greg Wilson's avatar
Greg Wilson committed
50

Greg Wilson's avatar
Greg Wilson committed
51
### Usage
Greg Wilson's avatar
Greg Wilson committed
52

Greg Wilson's avatar
Greg Wilson committed
53 54 55
Just `require` the `react-native-apple-healthkit` module and you're ready to go!
```javascript
var AppleHealthKit = require('react-native-apple-healthkit');
Greg Wilson's avatar
Greg Wilson committed
56

Greg Wilson's avatar
Greg Wilson committed
57 58 59 60 61
...

let healthKitOptions = {
    permissions: {
        read: ["Height", "Weight", "Steps", "DateOfBirth", "BodyMassIndex"],
Greg Wilson's avatar
Greg Wilson committed
62
        write: ["Weight", "Steps", "BodyMassIndex"]
Greg Wilson's avatar
Greg Wilson committed
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
    }
};

AppleHealthKit.initHealthKit(healthKitOptions, (err, res) => {
    if(err) {
        console.log("error initializing healthkit: ", err);
        return;
    }
    console.log("HEALTHKIT INITIALIZED!");
    // ...
});


```

Greg Wilson's avatar
Greg Wilson committed
78 79 80 81 82 83 84 85
When the module has been successfully initialized you can read and write HealthKit data

```javascript
var AppleHealthKit = require('react-native-apple-healthkit');
var _ = require('lodash');

...

Greg Wilson's avatar
Greg Wilson committed
86
AppleHealthKit.getLatestWeight(null, (err, weight) => {
Greg Wilson's avatar
Greg Wilson committed
87 88 89 90 91 92 93 94 95 96 97
    if(err){
        console.log("error getting current weight: ", err);
        return;
    }
    weight = _.round(weight,1);
    // do something with the weight...
});

...

let myWeight = 200;
Greg Wilson's avatar
Greg Wilson committed
98
AppleHealthKit.saveWeight({value:myWeight}, (err, res) => {
Greg Wilson's avatar
Greg Wilson committed
99 100 101 102 103 104 105 106 107
    if(err){
        console.log("error saving weight to healthkit: ", err);
        return;
    }
    // weight successfully saved
});


```
Greg Wilson's avatar
Greg Wilson committed
108 109


Greg Wilson's avatar
Greg Wilson committed
110 111 112

## Documentation

Greg Wilson's avatar
Greg Wilson committed
113 114 115 116
### Permissions

The available HealthKit permissions to use with `initHealthKit` 

Greg Wilson's avatar
Greg Wilson committed
117
##### Read Permissions
Greg Wilson's avatar
Greg Wilson committed
118

Greg Wilson's avatar
Greg Wilson committed
119
| Permission        | HealthKit Identifier Type                     |
Greg Wilson's avatar
Greg Wilson committed
120
|-------------------|-----------------------------------------------|
Greg Wilson's avatar
Greg Wilson committed
121
| Height            | HKQuantityTypeIdentifierHeight                |
Greg Wilson's avatar
Greg Wilson committed
122 123 124 125 126 127 128 129 130
| Weight            | HKQuantityTypeIdentifierBodyMass              |
| BodyFatPercentage | HKQuantityTypeIdentifierBodyFatPercentage     |
| BodyMassIndex     | HKQuantityTypeIdentifierBodyMassIndex         |
| LeanBodyMass      | HKQuantityTypeIdentifierLeanBodyMass          |
| Steps             | HKQuantityTypeIdentifierStepCount             |
| BiologicalSex     | HKCharacteristicTypeIdentifierBiologicalSex   |
| DateOfBirth       | HKCharacteristicTypeIdentifierDateOfBirth     |
| DietaryEnergy     | HKQuantityTypeIdentifierDietaryEnergyConsumed |
| ActiveEnergy      | HKQuantityTypeIdentifierActiveEnergyBurned    |
Greg Wilson's avatar
Greg Wilson committed
131

Greg Wilson's avatar
Greg Wilson committed
132
##### Write Permissions
Greg Wilson's avatar
Greg Wilson committed
133

Greg Wilson's avatar
Greg Wilson committed
134 135 136 137 138 139 140 141 142 143
| Permission        | HealthKit Identifier Type                     |
|-------------------|-----------------------------------------------|
| Height            | HKQuantityTypeIdentifierHeight                |
| Weight            | HKQuantityTypeIdentifierBodyMass              |
| BodyFatPercentage | HKQuantityTypeIdentifierBodyFatPercentage     |
| BodyMassIndex     | HKQuantityTypeIdentifierBodyMassIndex         |
| LeanBodyMass      | HKQuantityTypeIdentifierLeanBodyMass          |
| Steps             | HKQuantityTypeIdentifierStepCount             |
| DietaryEnergy     | HKQuantityTypeIdentifierDietaryEnergyConsumed |
| ActiveEnergy      | HKQuantityTypeIdentifierActiveEnergyBurned    |
Greg Wilson's avatar
Greg Wilson committed
144
        
Greg Wilson's avatar
Greg Wilson committed
145 146 147 148 149

### Options



Greg Wilson's avatar
Greg Wilson committed
150 151
### Methods

Greg Wilson's avatar
Greg Wilson committed
152 153
#### **`isAvailable`** 
check if HealthKit is available on the device
Greg Wilson's avatar
Greg Wilson committed
154 155 156 157 158 159 160
```javascript
AppleHealthKit.isAvailable((err: string, available: bool) => {
    if(available){
        // ...
    }
});
```
Greg Wilson's avatar
Greg Wilson committed
161
___
Greg Wilson's avatar
Greg Wilson committed
162

Greg Wilson's avatar
Greg Wilson committed
163
#### **`initHealthKit`** 
Greg Wilson's avatar
Greg Wilson committed
164
initialize HealthKit. this will show the HealthKit permissions prompt for any read/write permissions that have not yet been selected by the user.
Greg Wilson's avatar
Greg Wilson committed
165 166 167 168 169

`initHealthKit` requires an options object with HealthKit permission settings.
```javascript
let healthKitOptions = {
    permissions: {
Greg Wilson's avatar
Greg Wilson committed
170
        read: ["Height", "Weight", "Steps", "DateOfBirth", "BodyMassIndex"],
Greg Wilson's avatar
Greg Wilson committed
171
        write: ["Weight", "Steps", "BodyMassIndex"]
Greg Wilson's avatar
Greg Wilson committed
172 173
    }
};
Greg Wilson's avatar
Greg Wilson committed
174
```
Greg Wilson's avatar
Greg Wilson committed
175

Greg Wilson's avatar
Greg Wilson committed
176
```javascript
Greg Wilson's avatar
Greg Wilson committed
177 178 179 180 181 182 183 184 185 186
AppleHealthKit.initHealthKit(healthKitOptions: object, (err: string, res: object) => {
    if(err) {
        console.log("error initializing healthkit: ", err);
        return;
    }
    // healthkit is initialized...
    // now safe to read and write healthkit data...
});
```

Greg Wilson's avatar
Greg Wilson committed
187 188
___

189 190 191 192 193 194 195 196 197 198 199 200 201
#### **`getStepCountForToday`**
get the the aggregated total steps for the current day starting and ending at midnight
```javascript
AppleHealthKit.getStepCountForToday(null, (err: Object, steps: number) => {
    if(this._handleHealthKitError(err, 'getStepCountForToday')){
        return;
    }
    // use steps...
});
```

___

202
#### **`getStepCountForDay`**
Greg Wilson's avatar
Greg Wilson committed
203
get the the aggregated total steps for the day provided as `date` in options object. the `date` field expects an ISO date string as its value
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
```javascript
let d = new Date(2016,5,27);
let options = {
    date: d.toISOString()
};
AppleHealthKit.getStepCountForDay(options, (err, steps) => {
    if(this._handleHealthKitError(err, 'getStepCountForDay')){
        return;
    }
    // steps is the step count for day 'd'
});
```

___

219 220 221
#### **`getMultiDayStepCounts`**
get the total steps per day over a specified date range. 

Greg Wilson's avatar
Greg Wilson committed
222
`getMultiDayStepCounts` accepts an options object containing required *`startDate: ISO8601Timestamp`* and optional *`endDate: ISO8601Timestamp`*. if `endDate` is not provided it will default to the current time
223 224 225 226 227 228
```javascript
let options = {
    startDate: (new Date(2016,5,1)).toISOString()  // required
    endDate:   (new Date()).toISOString()          // optional; default now
};
```
Greg Wilson's avatar
Greg Wilson committed
229
the function will be called with an array of elements `res` containing date and step count information
230 231 232 233 234 235
```javascript
 AppleHealthKit.getMultiDayStepCounts(options, (err: Object, res: Array<Array<string|number>>) => {
    if(this._handleHealthKitError(err, 'getMultiDayStepCounts')){
        return;
    }
    // 'res' is array of [ISOTimestamp: string, stepCount: number] arrays
Greg Wilson's avatar
Greg Wilson committed
236
    // sorted ascending from startDate through endDate
237 238 239
    for(let i=0; i<res.length; ++i){
        let elem = res[i];
        // elem[0] is ISOTimestamp : string
Greg Wilson's avatar
Greg Wilson committed
240
        // elem[1] is step count   : number
241 242 243 244 245 246
    }
});
```

___

247
#### **`getLatestWeight`**
Greg Wilson's avatar
Greg Wilson committed
248
get the most recent weight value
Greg Wilson's avatar
Greg Wilson committed
249
```javascript
250
AppleHealthKit.getLatestWeight(null, (err: string, weight: number) => {
Greg Wilson's avatar
Greg Wilson committed
251
    if(err){
252
        console.log("error getting latest weight: ", err);
Greg Wilson's avatar
Greg Wilson committed
253 254 255
        return;
    }
    weight = _.round(weight,1);
Greg Wilson's avatar
Greg Wilson committed
256
    // use weight ...
Greg Wilson's avatar
Greg Wilson committed
257 258 259
});
```

Greg Wilson's avatar
Greg Wilson committed
260 261
___

Greg Wilson's avatar
Greg Wilson committed
262 263
#### **`saveWeight`**
save a numeric weight value to HealthKit
Greg Wilson's avatar
Greg Wilson committed
264

Greg Wilson's avatar
Greg Wilson committed
265
`saveWeight` accepts an options object containing a numeric weight value:
Greg Wilson's avatar
Greg Wilson committed
266
```javascript
Greg Wilson's avatar
Greg Wilson committed
267
let options = {value: 200}
Greg Wilson's avatar
Greg Wilson committed
268 269
```
```javascript
Greg Wilson's avatar
Greg Wilson committed
270
AppleHealthKit.saveWeight(options, (err, res) => {
Greg Wilson's avatar
Greg Wilson committed
271 272 273 274 275 276 277
    if(err){
        console.log("error saving weight to healthkit: ", err);
        return;
    }
    // weight successfully saved
});
```
Greg Wilson's avatar
Greg Wilson committed
278

279 280 281 282 283 284 285 286 287 288
___

#### **`getLatestHeight`**
get the most recent height value
```javascript
AppleHealthKit.getLatestHeight(null, (err: string, height: number) => {
    if(err){
        console.log("error getting latest height: ", err);
        return;
    }
Greg Wilson's avatar
Greg Wilson committed
289
    // use height ...
290 291
});
```
Greg Wilson's avatar
Greg Wilson committed
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310

___

#### **`saveHeight`**
save a numeric height value to HealthKit

`saveHeight` accepts an options object containing a numeric height value:
```javascript
let options = {value: 200}
```
```javascript
AppleHealthKit.saveHeight(options, (err, res) => {
    if(this._handleHealthKitError(err, 'saveHeight')){
        return;
    }
    // height successfully saved
});
```

Greg Wilson's avatar
Greg Wilson committed
311 312 313
___

#### **`getLatestBmi`**
Greg Wilson's avatar
Greg Wilson committed
314
get the most recent BMI data. the handler function will be called with a `bmi` object containing *`value: number`*, *`startDate: ISO8601Timestamp`*, and *`endDate: ISO8601Timestamp`*. The BMI value may be very old so the sample dates are provided as well. *should apply this to all other RCT types* 
Greg Wilson's avatar
Greg Wilson committed
315 316 317 318 319 320 321 322 323 324 325 326 327 328
```javascript
AppleHealthKit.getLatestBmi(null, (err: string, bmi: Object) => {
    if(err){
        console.log("error getting latest bmi data: ", err);
        return;
    }
    if(bmi && bmi.value){
        let d = bmi.startDate
        let val = bmi.value;
        // ...
    }
});
```

329 330
___

Greg Wilson's avatar
Greg Wilson committed
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
#### **`saveBmi`**
save a numeric BMI value to HealthKit

`saveBmi` accepts an options object containing a numeric BMI value:
```javascript
let options = {value: 27.2}
```
```javascript
AppleHealthKit.saveBmi(options, (err, res) => {
    if(this._handleHealthKitError(err, 'saveBmi')){
        return;
    }
    // BMI successfully saved
});
```

___

349
#### **`getLatestBodyFatPercentage`**
Greg Wilson's avatar
Greg Wilson committed
350
get the most recent body fat percentage. the percentage value is a number between 0 and 100
351 352 353 354 355
```javascript
AppleHealthKit.getLatestBodyFatPercentage(null, (err: Object, bodyFatPercentage: number) => {
    if(this._handleHealthKitError(err, 'getLatestBodyFatPercentage')){
        return;
    }
Greg Wilson's avatar
Greg Wilson committed
356
    // use bodyFatPercentage ...
357 358 359
});
```

Greg Wilson's avatar
Greg Wilson committed
360 361 362 363 364 365 366 367 368 369 370 371
___

#### **`getLatestLeanBodyMass`**
get the most recent lean body mass. the value is a number representing the weight in pounds (lbs)
```javascript
 AppleHealthKit.getLatestLeanBodyMass(null, (err: Object, leanBodyMass: number) => {
    if(this._handleHealthKitError(err, 'getLatestLeanBodyMass')){
        return;
    }
    // use leanBodyMass ...
});
```
Greg Wilson's avatar
Greg Wilson committed
372

Greg Wilson's avatar
Greg Wilson committed
373 374
## Examples

Greg Wilson's avatar
Greg Wilson committed
375
![alt text](https://raw.githubusercontent.com/GregWilson/react-native-apple-healthkit/master/examples/images/IMG_0205.PNG "Example App Screenshot")
Greg Wilson's avatar
Greg Wilson committed
376

377

Greg Wilson's avatar
Greg Wilson committed
378
[Apple HealthKit]: https://developer.apple.com/healthkit/
Greg Wilson's avatar
Greg Wilson committed
379
[react-native-apple-healthkit]: https://www.npmjs.com/package/react-native-apple-healthkit