React Native library for step tracking based on Google Fit (Android) and CoreMotion (iOS) native API's.
| React Native version(s) | Fitness Tracker version |
|---|---|
| <= v0.59 | v0.1.1 |
| <= v0.62 | v0.1.2 (Migrated to Autolinking) |
| >= v0.63 | v0.1.4+ (Dropped iOS 8 support) |
yarn:
$ yarn add @kilohealth/rn-fitness-tracker
npm:
$ npm i @kilohealth/rn-fitness-tracker
In your project directory, run:
yarn:
yarn add react-native-device-info react-native-permissions
npm:
npm i react-native-device-info react-native-permissions
- Add following lines to info.plist file
<dict>tag:
<!-- Fitness tracker -->
<key>NSMotionUsageDescription</key>
<string>Reason string goes here</string>
<!-- Health tracker -->
<key>NSHealthUpdateUsageDescription</key>
<string>Reason string goes here</string>
<key>NSHealthShareUsageDescription</key>
<string>Reason string goes here</string>or
Navigate to info.plist file in XCode ➜ Add new property list key - NSMotionUsageDescription.
This will add new line in the containing Privacy - Motion Usage Description. Same to be done with HealthKit.
- Make sure that you have at least one permission handler set up.
Else you will get error
**No permission handler detected**
React-Native < 0.60 - Manual linking for projects with older react-native version
- Add following line to Podfile:
pod 'RNFitnessTracker', :podspec => '../node_modules/@kilohealth/rn-fitness-tracker/ios/RNFitnessTracker.podspec'. - In XCode, in the project navigator, right click
Libraries➜Add Files to [your project's name] - Go to
node_modules➜@kilohealth/rn-fitness-trackerand addRNFitnessTracker.xcodeproj - In XCode, in the project navigator, select your project. Add
libRNFitnessTracker.ato your project'sBuild Phases➜Link Binary With Libraries - If you want to use Health Tracking, make sure to add HealthKit under XCode ➜
Signing & Capabilities➜+ Capability➜HealthKit
- Enable Google Fitness Api:
Setting up Android Fit API permissions
-
Make sure your Google account has access to app firebase project.
-
Create an OAuth screen for your project.
-
Select
User Type: Externaland fill out the form. Add../auth/fitness.activity.readto Scopes for Google APIs. -
Fill out next popup forms with a brief explanation why you're using the activity tracker (no need to write much).
-
Go to Google console
-
Select your app's project,
Continue, andGo to Credentials. -
Where will you be calling the API from? Select
Android. -
What data will you be accessing? Select
User dataand click next. -
The Signing-certificate fingerprint generation command must be pointed to your app release / staging keystore file.
-
Save and submit everything. If you haven't got your google services config inside your app - download your
google-services.jsonfile from firebase console and place it insideandroid/appdirectory within your project.
-
React Native autolinking should handle the rest.
-
Add
ACTIVITY_RECOGNITIONpermission toAndroidManifest.xml
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>Manual linking for projects with older react-native version
-
Open up
android/app/src/main/java/[...]/MainActivity.javaAddimport com.fitnesstracker.RNFitnessTrackerPackage;to the imports at the top of the file. Addnew RNFitnessTrackerPackage()to the list returned by thegetPackages()method. -
Append the following lines to
android/settings.gradle:
include ':@kilohealth-rn-fitness-tracker'
project(':@kilohealth-rn-fitness-tracker').projectDir = new File(rootProject.projectDir, '../node_modules/@kilohealth/rn-fitness-tracker/android')
3.Insert the following lines inside the dependencies block in android/app/build.gradle:
implementation project(path: ':@kilohealth-rn-fitness-tracker')
implementation 'com.google.android.gms:play-services-fitness:16.0.1'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
import { FitnessTrackerAPI } from '@kilohealth/rn-fitness-tracker';
// This step is required in order to use any of the methods bellow
// Returns an object:
// authorized: boolean;
// shouldOpenAppSettings: boolean;
// trackingNotSupported?: boolean;
const authorizationStatus = await FitnessTrackerAPI.setupTracking();
// Get steps total today
const steps = await FitnessTrackerAPI.getStepsToday();
// Get steps total this week
const steps = await FitnessTrackerAPI.getStepsWeekTotal();
// Get running & walking distance today
const distance = await FitnessTrackerAPI.getDistanceToday();
// Get floors climbed today
const floorsClimbed = await FitnessTrackerAPI.getFloorsToday();To access native API:
import { RNFitnessTracker } from '@kilohealth/rn-fitness-tracker';
import {
HealthTrackerAPI,
HealthDataTypes,
UnitTypes,
WorkoutTypes,
} from '@kilohealth/rn-fitness-tracker';
// Setup Health tracking
const authorizationStatus = await HealthTrackerAPI.setupTracking(
[HealthDataTypes.Carbohydrates, HealthDataTypes.Calcium], // write types
[HealthDataTypes.Carbohydrates, HealthDataTypes.Fiber], // read types
);
// Get health data type total from HealthKit
const healthTotalFiber = await HealthTrackerAPI.getStatisticTotalForToday({
key: HealthDataTypes.Fiber,
unit: UnitTypes.grams,
});
// Get absolute data type total from HealthKit
const absoluteTotalFiber = await HealthTrackerAPI.getAbsoluteTotalForToday({
key: HealthDataTypes.Fiber,
unit: UnitTypes.grams,
});
// Write single category health data to HealthKit
const writeStatus = await HealthTrackerAPI.writeData({
key: HealthDataTypes.Carbohydrates,
quantity: 28,
unit: UnitTypes.grams,
metadata: {
Meal: 'Lightly smoked salmon',
},
});
// Write health data array to HealthKit
const writeStatus = await HealthTrackerAPI.writeDataArray([
{
key: HealthDataTypes.Carbohydrates,
quantity: 55,
unit: UnitTypes.grams,
metadata: {
Meal: 'Lightly smoked salmon',
},
},
{
key: HealthDataTypes.Calcium,
quantity: 35,
unit: UnitTypes.grams,
metadata: {
Meal: 'Milk pint',
'Random parameter': 'Very delicious milk',
},
},
]);
// Record a workout to HealthKit
const currentDate = +new Date();
const writeStatus = await HealthTrackerAPI.recordWorkout({
key: WorkoutTypes.Bowling,
startDate: currentDate,
endDate: currentDate + 3600,
energyBurned: 221, // kcal
metadata: {
'Workout name': 'Las Vegas II',
},
});To access native API:
import { RNHealthTracker } from '@kilohealth/rn-fitness-tracker';