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-tracker
and addRNFitnessTracker.xcodeproj
- In XCode, in the project navigator, select your project. Add
libRNFitnessTracker.a
to 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: External
and fill out the form. Add../auth/fitness.activity.read
to 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 data
and 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.json
file from firebase console and place it insideandroid/app
directory within your project.
-
React Native autolinking should handle the rest.
-
Add
ACTIVITY_RECOGNITION
permission 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.java
Addimport 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';