README.md 11 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 16
    * [Usage](#usage)
  * [Documentation](#documentation)
    * [Permissions](#permissions)
    * [Methods](#methods)
Greg Wilson's avatar
Greg Wilson committed
17
      * [isAvailable](#isavailable)
Greg Wilson's avatar
Greg Wilson committed
18
      * [initHealthKit](#inithealthkit)
Greg Wilson's avatar
Greg Wilson committed
19
      * [getStepCountForToday](#getstepcountfortoday)
20
      * [getStepCountForDay](#getstepcountforday)
21
      * [getMultiDayStepCounts](#getmultidaystepcounts)
Greg Wilson's avatar
Greg Wilson committed
22 23 24 25 26 27 28 29
      * [getLatestWeight](#getlatestweight)
      * [saveWeight](#saveweight)
      * [getLatestHeight](#getlatestheight)
      * [saveHeight](#saveheight)
      * [getLatestBmi](#getlatestbmi)
      * [saveBmi](#savebmi)
      * [getLatestBodyFatPercentage](#getlatestbodyfatpercentage)
      * [getLatestLeanBodyMass](#getlatestleanbodymass)
Greg Wilson's avatar
Greg Wilson committed
30 31
  * [Examples](#examples)
  
Greg Wilson's avatar
Greg Wilson committed
32

Greg Wilson's avatar
Greg Wilson committed
33 34
## Getting started

Greg Wilson's avatar
Greg Wilson committed
35 36
###  Installation

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

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

Greg Wilson's avatar
Greg Wilson committed
41
##### Xcode
Greg Wilson's avatar
Greg Wilson committed
42
  
Greg Wilson's avatar
Greg Wilson committed
43 44 45 46 47
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
48

Greg Wilson's avatar
Greg Wilson committed
49
### Usage
Greg Wilson's avatar
Greg Wilson committed
50

Greg Wilson's avatar
Greg Wilson committed
51 52 53
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
54

Greg Wilson's avatar
Greg Wilson committed
55 56 57 58 59
...

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

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
76 77 78 79 80 81 82 83
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
84
AppleHealthKit.getLatestWeight(null, (err, weight) => {
Greg Wilson's avatar
Greg Wilson committed
85 86 87 88 89 90 91 92 93 94 95
    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
96
AppleHealthKit.saveWeight({value:myWeight}, (err, res) => {
Greg Wilson's avatar
Greg Wilson committed
97 98 99 100 101 102 103 104 105
    if(err){
        console.log("error saving weight to healthkit: ", err);
        return;
    }
    // weight successfully saved
});


```
Greg Wilson's avatar
Greg Wilson committed
106 107


Greg Wilson's avatar
Greg Wilson committed
108 109 110

## Documentation

Greg Wilson's avatar
Greg Wilson committed
111 112 113 114
### Permissions

The available HealthKit permissions to use with `initHealthKit` 

Greg Wilson's avatar
Greg Wilson committed
115
#### Read Permissions
Greg Wilson's avatar
Greg Wilson committed
116

Greg Wilson's avatar
Greg Wilson committed
117
| Permission        | HealthKit Identifier Type                     |
Greg Wilson's avatar
Greg Wilson committed
118
|-------------------|-----------------------------------------------|
Greg Wilson's avatar
Greg Wilson committed
119
| Height            | HKQuantityTypeIdentifierHeight                |
Greg Wilson's avatar
Greg Wilson committed
120 121 122 123 124 125 126 127 128
| 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
129

Greg Wilson's avatar
Greg Wilson committed
130
#### Write Permissions
Greg Wilson's avatar
Greg Wilson committed
131

Greg Wilson's avatar
Greg Wilson committed
132 133 134 135 136 137 138 139 140 141
| 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
142
        
Greg Wilson's avatar
Greg Wilson committed
143 144 145 146 147

### Options



Greg Wilson's avatar
Greg Wilson committed
148 149
### Methods

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

Greg Wilson's avatar
Greg Wilson committed
161
#### **`initHealthKit`** 
Greg Wilson's avatar
Greg Wilson committed
162
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
163 164 165 166 167

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

Greg Wilson's avatar
Greg Wilson committed
174
```javascript
Greg Wilson's avatar
Greg Wilson committed
175 176 177 178 179 180 181 182 183 184
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
185 186
___

187 188 189 190 191 192 193 194 195 196 197 198 199
#### **`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...
});
```

___

200
#### **`getStepCountForDay`**
Greg Wilson's avatar
Greg Wilson committed
201
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
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
```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'
});
```

___

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

Greg Wilson's avatar
Greg Wilson committed
220
`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
221 222 223 224 225 226
```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
227
the function will be called with an array of elements `res` containing date and step count information
228 229 230 231 232 233
```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
234
    // sorted ascending from startDate through endDate
235 236 237
    for(let i=0; i<res.length; ++i){
        let elem = res[i];
        // elem[0] is ISOTimestamp : string
Greg Wilson's avatar
Greg Wilson committed
238
        // elem[1] is step count   : number
239 240 241 242 243 244
    }
});
```

___

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

Greg Wilson's avatar
Greg Wilson committed
258 259
___

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

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

277 278 279 280 281 282 283 284 285 286
___

#### **`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
287
    // use height ...
288 289
});
```
Greg Wilson's avatar
Greg Wilson committed
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308

___

#### **`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
309 310 311
___

#### **`getLatestBmi`**
Greg Wilson's avatar
Greg Wilson committed
312
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
313 314 315 316 317 318 319 320 321 322 323 324 325 326
```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;
        // ...
    }
});
```

327 328
___

Greg Wilson's avatar
Greg Wilson committed
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
#### **`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
});
```

___

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

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

#### **`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
370

Greg Wilson's avatar
Greg Wilson committed
371 372
## Examples

Greg Wilson's avatar
Greg Wilson committed
373
![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
374

375

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