A React Native package to interact with Apple HealthKit for iOS.
🚨 Expo: This package is not available in the Expo Go app. Learn how you can use it with custom dev clients.
- Install the react-native-health package from npm
yarn add react-native-health
- If you are using CocoaPods you can run the following
from the
ios/
folder of your app
pod install
Or, if you need to manually link it, run
react-native link react-native-health
- Update the
ios/<Project Name>/info.plist
file in your project
<key>NSHealthShareUsageDescription</key>
<string>Read and understand health data.</string>
<key>NSHealthUpdateUsageDescription</key>
<string>Share workout data with other apps.</string>
<!-- Below is only required if requesting clinical health data -->
<key>NSHealthClinicalHealthRecordsShareUsageDescription</key>
<string>Read and understand clinical health data.</string>
To add Healthkit support to your application's Capabilities
- Open the
ios/
folder of your project in Xcode - Select the project name in the left sidebar
- In the main view select '+ Capability' and double click 'HealthKit'
To enable access to clinical data types, check the Clinical Health Records
box.
In order to start collecting or saving data to HealthKit, you need to request the user's permissions for the given data types. It can be done in the following way
import AppleHealthKit, {
HealthValue,
HealthKitPermissions,
} from 'react-native-health'
/* Permission options */
const permissions = {
permissions: {
read: [AppleHealthKit.Constants.Permissions.HeartRate],
write: [AppleHealthKit.Constants.Permissions.Steps],
},
} as HealthKitPermissions
AppleHealthKit.initHealthKit(permissions, (error: string) => {
/* Called after we receive a response from the system */
if (error) {
console.log('[ERROR] Cannot grant permissions!')
}
/* Can now read or write to HealthKit */
const options = {
startDate: new Date(2020, 1, 1).toISOString(),
}
AppleHealthKit.getHeartRateSamples(
options,
(callbackError: string, results: HealthValue[]) => {
/* Samples are now collected from HealthKit */
},
)
})
For background capabilities, Apple allows developers to setup long running observer queries for the health types needed.
To setup that in your app, in XCode open your ios/AppDelegate.m
file and add the
following statements:
#import "AppDelegate.h"
...
/* Add the library import at the top of AppDelegate.m */
#import "RCTAppleHealthKit.h"
...
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self
launchOptions:launchOptions];
...
/* Add Background initializer for HealthKit */
[[RCTAppleHealthKit new] initializeBackgroundObservers:bridge];
...
return YES;
}
After that you can start listening for data updates using the React Native client. For more information, see background observers.
There is a gitbook version for the documentation on this link.
All the documentation is under the docs folder. Additionally, they are splitted in the following categories
- background observers
- initStepCountObserver - DEPRECATED
- setObserver - DEPRECATED
- getLatestHeight
- getLatestWeight
- getHeightSamples
- getWeightSamples
- getBodyTemperatureSamples
- getLatestBodyFatPercentage
- getBodyFatPercentageSamples
- getLatestLeanBodyMass
- getLeanBodyMassSamples
- saveHeight
- saveWeight
- saveBodyFatPercentage
- saveBodyTemperature
- saveLeanBodyMass
- getDailyStepCountSamples
- getStepCount
- getSamples
- getDailyDistanceWalkingRunningSamples
- getDistanceWalkingRunning
- getDailyDistanceSwimmingSamples
- getDistanceSwimming
- getDailyDistanceCyclingSamples
- getDistanceCycling
- getDailyFlightsClimbedSamples
- getFlightsClimbed
- saveSteps
- getBloodAlcoholContentSamples
- getBloodGlucoseSamples
- getLatestBloodAlcoholContent
- saveBloodAlcoholContent
- saveBloodGlucoseSample
- deleteBloodGlucoseSample
- getBloodPressureSamples
- getElectrocardiogramSamples
- getHeartRateSamples
- getHeartRateVariabilitySamples
- getHeartbeatSeriesSamples
- getOxygenSaturationSamples
- getRestingHeartRateSamples
- getVo2MaxSamples
- getLatestBmi
- getBmiSamples
- getRespiratoryRateSamples
- getWalkingHeartRateAverage
- saveBmi
Due to Apple's privacy model, if a user has previously denied a specific permission they will not be prompted again for that permission. The user will need to go into the Apple Health app and grant the permission to your app.
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 when initializing the library.
If extra read or write permissions are added to the options object, the app will request for user's permission to them when the library is initialized again.
- Run
yarn add react-native-health
- In XCode, in the project navigator, right-click
Libraries
➜Add Files to [your project's name]
- Go to
node_modules
➜react-native-health
and addRCTAppleHealthkit.xcodeproj
- In XCode, in the project navigator, select your project. Add
libRCTAppleHealthkit.a
to your project'sBuild Phases
➜Link Binary With Libraries
- Click
RCTAppleHealthkit.xcodeproj
in the project navigator and go theBuild Settings
tab. Make sure 'All' is toggled on (instead of 'Basic'). In theSearch Paths
section, look forHeader Search Paths
and make sure it contains both$(SRCROOT)/../../react-native/React
and$(SRCROOT)/../../../React
- mark both asrecursive
. - Enable Healthkit in your application's
Capabilities
- Compile and run
We appreciate any additional request and/or contribution to react-native-health
.
The issues tracker
is used to keep a list of features and bugs to be worked on. Please see our
contributing documentation
for some tips on getting started.
This package is a fork of rn-apple-healthkit
This package also inherits additional features from Nutrisense fork