My new module
npm install react-native-motion-activity-tracker


A React Native library to access and track motion activity data using Apple's Core Motion API. It supports activities like walking, running, automotive, stationary, and cycling, with real-time updates and historical data fetching.
- Check motion activity authorization status.
- Start and stop real-time motion tracking.
- Fetch historical activity data.
- Built for iOS with Core Motion API & for android with Activity Recognition API
Note: This library requires a custom dev client when using with Expo.
1. Install the package:
``bash
npm install react-native-motion-activity-tracker
`
2. Add this to ur app.son
{
"expo": {
"plugins": [
"react-native-motion-activity-tracker"
]
}
}
`
3. If you want to customize the iOS permission description, you can configure it like this:
{
"expo": {
"plugins": [
[
"react-native-motion-activity-tracker",
{
"NSMotionUsageDescription": "This app uses motion data to enhance your experience."
}
]
]
}
}
4. After making these changes, rebuild your app to apply the native changes:
`bash`
expo prebuild
`TypeScript
import * as MotionActivityTracker from "motion-activity-tracker";
import React, { useEffect, useState } from "react";
import { Text, View, Button, StyleSheet } from "react-native";
export default function App() {
const [message, setMessage] = useState("Initializing...");
const [tracking, setTracking] = useState(false);
const [data, setData] = useState<
MotionActivityTracker.HistoricalActivity[] | undefined
>();
const startDate = new Date(Date.now() - 7 24 60 60 1000); // One week ago
const endDate = new Date();
// Fetch historical activity data
useEffect(() => {
const setActivityHistoricalData = async () => {
const data = await MotionActivityTracker.getHistoricalData(
startDate,
endDate,
);
if (data) {
console.log(data[0]);
setData(data);
}
};
setActivityHistoricalData();
}, []);
// Subscribe to motion state changes
useEffect(() => {
const subscription = MotionActivityTracker.addMotionStateChangeListener(
(event) => {
console.log("New Motion State:", event.state); // Log the new state
setMessage(Tracking started: ${event.state}); // Update the message
},
);
return () => {
subscription.remove(); // Clean up subscription on unmount
};
}, [message]);
const handleStartTracking = async () => {
try {
const result = await MotionActivityTracker.startTracking();
setMessage(Tracking started: ${result});Error: ${error}
setTracking(true);
} catch (error) {
setMessage();
console.error(error);
}
};
const handleStopTracking = () => {
MotionActivityTracker.stopTracking();
setMessage("Tracking stopped");
setTracking(false);
};
return (
title={tracking ? "Stop Tracking" : "Start Tracking"}
onPress={tracking ? handleStopTracking : handleStartTracking}
/>
{data && data.length > 0 && (
{/ Display the latest entry /}
{(() => {
const latestActivity = data.reduce((latest, current) =>
current.timestamp > latest.timestamp ? current : latest,
);
return (
<>
Automotive: {latestActivity.automotive ? "Yes" : "No"}
Running: {latestActivity.running ? "Yes" : "No"}
Stationary: {latestActivity.stationary ? "Yes" : "No"}
Timestamp: {new Date(latestActivity.timestamp * 1000).toLocaleString()}
Unknown: {latestActivity.unknown ? "Yes" : "No"}
Walking: {latestActivity.walking ? "Yes" : "No"}
Confidence: {latestActivity.confidence}
>
);
})()}
)}
);
}
`
package before continuing.``
npm install react-native-device-activity
#### Add permissions for Motion & Fitness tracking in your Info.plist:
``
Run npx pod-install after installing the npm package.
- NOT_DETERMINEDRESTRICTED
- DENIED
- AUTHORIZED`
-
This project is licensed under the MIT License. See the LICENSE file for details.
Contributions are welcome!