README.md 11.7 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

Terrillo Walls's avatar
Terrillo Walls committed
5
## Installation
Greg Wilson's avatar
Greg Wilson committed
6

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

Terrillo Walls's avatar
Terrillo Walls committed
9
- Run `npm install rn-apple-healthkit --save`
Terrillo Walls's avatar
Terrillo Walls committed
10
- Run `react-native link rn-apple-healthkit`
Greg Wilson's avatar
Greg Wilson committed
11

Terrillo Walls's avatar
Terrillo Walls committed
12 13 14 15 16 17 18
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>
```
19

Terrillo Walls's avatar
Terrillo Walls committed
20
## Manual Installation
Greg Wilson's avatar
Greg Wilson committed
21

Terrillo Walls's avatar
Terrillo Walls committed
22 23
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
24
3. Go to `node_modules``rn-apple-healthkit` and add `RCTAppleHealthkit.xcodeproj`
Terrillo Walls's avatar
Terrillo Walls committed
25 26 27
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`
Terrillo Walls's avatar
Terrillo Walls committed
28
![](https://i.imgur.com/eOCCCyv.png "Xcode Capabilities Section")
Terrillo Walls's avatar
Terrillo Walls committed
29
7. Compile and run
Greg Wilson's avatar
Greg Wilson committed
30

Greg Wilson's avatar
Greg Wilson committed
31

Terrillo Walls's avatar
Terrillo Walls committed
32 33
## Get Started
Initialize Healthkit. This will show the Healthkit permissions prompt for any read/write permissions set in the required `options` object.
Terrillo Walls's avatar
Terrillo Walls committed
34

Terrillo Walls's avatar
Terrillo Walls committed
35 36 37
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.

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
38

Terrillo Walls's avatar
Terrillo Walls committed
39 40 41 42 43 44
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.

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.

`initHealthKit` requires an options object with Healthkit permission settings
```javascript
Greg Wilson's avatar
Greg Wilson committed
45
let options = {
Greg Wilson's avatar
Greg Wilson committed
46
    permissions: {
Greg Wilson's avatar
Greg Wilson committed
47 48
        read: ["Height", "Weight", "StepCount", "DateOfBirth", "BodyMassIndex"],
        write: ["Weight", "StepCount", "BodyMassIndex"]
Greg Wilson's avatar
Greg Wilson committed
49 50 51 52
    }
};
```

Greg Wilson's avatar
Greg Wilson committed
53
```javascript
Terrillo Walls's avatar
Terrillo Walls committed
54
import AppleHealthKit from 'rn-apple-healthkit';
Greg Wilson's avatar
Greg Wilson committed
55

Terrillo Walls's avatar
Terrillo Walls committed
56 57 58 59 60
AppleHealthKit.initHealthKit(options: Object, (err: string, results: Object) => {
    if (err) {
        console.log("error initializing Healthkit: ", err);
        return;
    }
Terrillo Walls's avatar
Terrillo Walls committed
61

Terrillo Walls's avatar
Terrillo Walls committed
62 63 64 65 66 67 68
    // Height Example
    AppleHealthKit.getDateOfBirth(null, (err: Object, results: Object) => {
    if (this._handleHealthkitError(err, 'getDateOfBirth')) {
      return;
    }
      console.log(results)
    });
Terrillo Walls's avatar
Terrillo Walls committed
69

Terrillo Walls's avatar
Terrillo Walls committed
70 71
});
```
Terrillo Walls's avatar
Terrillo Walls committed
72

Terrillo Walls's avatar
Terrillo Walls committed
73 74 75 76
```javascript
{
	value: '1986-09-01T00:00:00.000-0400',
	age: 29
Terrillo Walls's avatar
Terrillo Walls committed
77
}
Greg Wilson's avatar
Greg Wilson committed
78
```
Greg Wilson's avatar
Greg Wilson committed
79

Terrillo Walls's avatar
Terrillo Walls committed
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
## Wiki
  * [Installation](https://github.com/terrillo/rn-apple-healthkit/wiki/Install)
  * [Documentation](#documentation)
    * [Permissions](#permissions)
    * [Units](#units)
    * Base Methods
      * [isAvailable](https://github.com/terrillo/rn-apple-healthkit/wiki/isAvailable())
      * [initHealthKit](https://github.com/terrillo/rn-apple-healthkit/wiki/initHealthKit())
    * Realtime Methods
      * [initStepCountObserver](https://github.com/terrillo/rn-apple-healthkit/wiki/initStepCountObserver())
    * Read Methods
      * [getBiologicalSex](https://github.com/terrillo/rn-apple-healthkit/wiki/getBiologicalSex())
      * [getBloodGlucoseSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getbloodglucosesamples())
      * [getBloodPressureSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getbloodpressuresamples())
      * [getBodyTemperatureSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getbodytemperaturesamples())
      * [getDailyStepCountSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getDailyStepCountSamples())
      * [getDateOfBirth](https://github.com/terrillo/rn-apple-healthkit/wiki/getDateOfBirth())
      * [getDistanceCycling](https://github.com/terrillo/rn-apple-healthkit/wiki/getdistancecycling())
      * [getDistanceWalkingRunning](https://github.com/terrillo/rn-apple-healthkit/wiki/getDistanceWalkingRunning())
      * [getFlightsClimbed](https://github.com/terrillo/rn-apple-healthkit/wiki/getflightsclimbed())
      * [getHeartRateSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getheartratesamples())
      * [getHeightSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getheightsamples())
      * [getLatestBmi](https://github.com/terrillo/rn-apple-healthkit/wiki/getlatestbmi())
      * [getLatestBodyFatPercentage](https://github.com/terrillo/rn-apple-healthkit/wiki/getlatestbodyfatpercentage())
      * [getLatestHeight](https://github.com/terrillo/rn-apple-healthkit/wiki/getlatestheight())
      * [getLatestLeanBodyMass](https://github.com/terrillo/rn-apple-healthkit/wiki/getlatestleanbodymass())
      * [getLatestWeight](https://github.com/terrillo/rn-apple-healthkit/wiki/getlatestweight())
      * [getRespiratoryRateSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getrespiratoryratesamples())
      * [getSleepSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getsleepsamples())
      * [getStepCount](https://github.com/terrillo/rn-apple-healthkit/wiki/getStepCount())
      * [getWeightSamples](https://github.com/terrillo/rn-apple-healthkit/wiki/getweightsamples())
    * Write Methods
      * [saveBmi](https://github.com/terrillo/rn-apple-healthkit/wiki/savebmi())
      * [saveHeight](https://github.com/terrillo/rn-apple-healthkit/wiki/saveheight())
      * [saveMindfulSession](https://github.com/terrillo/rn-apple-healthkit/wiki/saveMindfulSession())
      * [saveWeight](https://github.com/terrillo/rn-apple-healthkit/wiki/saveweight())
      * [saveSteps](https://github.com/terrillo/rn-apple-healthkit/wiki/saveSteps())
  * [References](#references)

## Supported Apple Permissions
Greg Wilson's avatar
Greg Wilson committed
120

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

123 124 125 126
| Permission             | Healthkit Identifier Type                                                                                                                                          | Read | Write |
|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|-------|
| BiologicalSex          | [HKCharacteristicTypeIdentifierBiologicalSex](https://developer.apple.com/reference/Healthkit/hkcharacteristictypeidentifierbiologicalsex?language=objc)           | ✓    |       |
| BloodGlucose           | [HKQuantityTypeIdentifierBloodGlucose](https://developer.apple.com/reference/Healthkit/hkquantitytypeidentifierbloodglucose?language=objc)                         | ✓    |       |
Terrillo Walls's avatar
Terrillo Walls committed
127 128
| BloodPressureDiastolic | [HKQuantityTypeIdentifierBloodPressureDiastolic](https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifierbloodpressurediastolic?language=objc) | ✓    | ✓     |
| BloodPressureSystolic  | [HKQuantityTypeIdentifierBloodPressureSystolic](https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifierbloodpressuresystolic?language=objc)   | ✓    | ✓     |
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| 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)               | ✓    |       |
| 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)                     |      |  ✓    |
| 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)                                 | ✓    | ✓     |
Terrillo Walls's avatar
Terrillo Walls committed
144

Terrillo Walls's avatar
Terrillo Walls committed
145
These permissions are exported as constants of the `rn-apple-healthkit` module.
Greg Wilson's avatar
Greg Wilson committed
146 147

```javascript
Terrillo Walls's avatar
Terrillo Walls committed
148
import AppleHealthKit from 'rn-apple-healthkit';
Greg Wilson's avatar
Greg Wilson committed
149 150 151 152

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

Greg Wilson's avatar
Greg Wilson committed
153
// setup healthkit read/write permissions using PERMS
Greg Wilson's avatar
Greg Wilson committed
154 155 156 157 158 159 160 161 162 163 164
const healthKitOptions = {
    permissions: {
        read:  [
            PERMS.StepCount,
            PERMS.Height,
        ],
        write: [
            PERMS.StepCount
        ],
    }
};
Greg Wilson's avatar
Greg Wilson committed
165 166
```

Terrillo Walls's avatar
Terrillo Walls committed
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
## Units
- bpm
- calorie
- celsius
- count
- day
- fahrenheit
- foot
- gram
- hour
- inch
- joule
- meter
- mgPerdL
- mile
- minute
- mmhg
- mmolPerL
- percent
- pound
- second
Greg Wilson's avatar
Greg Wilson committed
188

Terrillo Walls's avatar
Terrillo Walls committed
189 190
## References
- Apple Healthkit Documentation [https://developer.apple.com/Healthkit/](https://developer.apple.com/Healthkit/)
Daniele Volpi's avatar
Daniele Volpi committed
191

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