React Native Expo App: отслеживание местоположения останавливается во время работы фона после 1 дня с использованием бибAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 React Native Expo App: отслеживание местоположения останавливается во время работы фона после 1 дня с использованием биб

Сообщение Anonymous »

Я разрабатываю мобильное приложение для Android с использованием React Native с Expo Framework. Приложение предназначено для непрерывного отслеживания местоположения пользователя, даже при запуске в фоновом режиме. Для этого я внедрил библиотеку экспозиции для настройки GPS Hirlerer и обработки фоновых отслеживания. Похоже, что отслеживание местоположения фона прекращает функционировать полностью после дня. У меня есть: < /p>

Настройка фоновых и разрешений на местоположение переднего плана. < /Li>
Добавлены слушатели, чтобы отслеживать изменения в месте. Однако отслеживание останавливается после работы на один день. < /P>
Я ищу предложения по: < /p>

Основная причина этого вопроса. Не подходит для этого варианта использования, я был бы признателен по рекомендациям для альтернативных библиотек или подходов. < /p>
import React, { useEffect, useState } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import * as Location from 'expo-location';
import LottieView from 'lottie-react-native';
import { auth } from '../firebaseConfig';
import { db } from '../firebaseConfig';
import { doc, updateDoc, collection, addDoc, getDoc } from 'firebase/firestore';
import * as TaskManager from 'expo-task-manager';
import NetInfo from '@react-native-community/netinfo';
import { BackHandler } from 'react-native';
import { Timestamp } from 'firebase/firestore';

let lastFirebaseUpdate = 0;
let isInitialLocationUpdated = false;

// Define the background task at the top-level scope
TaskManager.defineTask('background-location-task', async ({ data, error }) => {
if (error) {
// Check if location services are enabled
if (error.code === 'E_LOCATION_SERVICES_DISABLED') {
console.log("Location services turned off in background");
await sendNotificationToAdmin("Location services turned off in background");
} else {
console.error("Error in background task:", error);
}
return;
}

// Check network connectivity
try {
const response = await fetch("https://www.google.com", { method: "HEAD" });
if (!response.ok) {
throw new Error("Network unavailable");
}
} catch (e) {
console.log("Network disconnected in background");
await sendNotificationToAdmin("Network disconnected in background");
}

if (data) {
const now = Date.now();
const { locations } = data;

if (locations && locations.length > 0) {
const currentLocation = locations[0];
console.log("Background Task - New Location:", currentLocation);

if (isInitialLocationUpdated) {
isInitialLocationUpdated = false;
return;
}

// Reverse geocode to get the address
const reverseGeocode = await Location.reverseGeocodeAsync({
latitude: currentLocation.coords.latitude,
longitude: currentLocation.coords.longitude,
});

const formattedAddress = reverseGeocode[0]?.formattedAddress || " ";
const uid = auth.currentUser.uid;

if (now - lastFirebaseUpdate >= 900000) {
lastFirebaseUpdate = now; // Update the timestamp

const firestoreTimestamp = Timestamp.now();
// Store the updated location in Firestore and add to Location History subcollection
try {
// Update main document
await updateDoc(doc(db, 'Sales Rep', uid), {
Latitude: currentLocation.coords.latitude,
Longitude: currentLocation.coords.longitude,
Address: formattedAddress,
Timestamp: firestoreTimestamp, // Store the current timestamp
});

// Add to Location History subcollection
const locationHistoryRef = collection(db, 'Sales Rep', uid, 'Location History');
await addDoc(locationHistoryRef, {
Latitude: currentLocation.coords.latitude,
Longitude: currentLocation.coords.longitude,
Address: formattedAddress,
Timestamp: firestoreTimestamp,
});

console.log("Location updated in Firestore and Location History subcollection.");
} catch (error) {
console.error("Error updating Firestore:", error);
}
}
else {
console.log('Skipped Firebase update; less than 15 minutes elapsed');
}

}
}
});

export default function SalesRepView() {
const [location, setLocation] = useState(null);
const [address, setAddress] = useState('');
const uid = auth.currentUser.uid; // Get the current user's UID

// Get location permission and start background tracking
useEffect(() => {
const getPermissionsAndLocation = async () => {
let { status: foregroundStatus } = await Location.requestForegroundPermissionsAsync();
if (foregroundStatus !== 'granted') {
console.log("Foreground location permission not granted");
return;
}

let { status: backgroundStatus } = await Location.requestBackgroundPermissionsAsync();
if (backgroundStatus !== 'granted') {
console.log("Background location permission not granted");
return;
}

// Start tracking the location in the background every 15 minutes
await Location.startLocationUpdatesAsync('background-location-task', {
accuracy: Location.Accuracy.High,
timeInterval: 900000, // 15 minutes in milliseconds
distanceInterval: 0, // Receive updates as the user moves
showsBackgroundLocationIndicator: true,
foregroundService: {
notificationTitle: 'Douglas & Sons (pvt) Ltd'
},
pausesUpdatesAutomatically: false,
});

let currentLocation = await Location.getCurrentPositionAsync({});
setLocation(currentLocation);
console.log("Initial Location:", currentLocation);

if (currentLocation) {
let reverseGeocode = await Location.reverseGeocodeAsync({
latitude: currentLocation.coords.latitude,
longitude: currentLocation.coords.longitude,
});

const formattedAddress = reverseGeocode[0]?.formattedAddress || " ";
setAddress(formattedAddress);
console.log("Address:", formattedAddress);

const intialTimestamp = Timestamp.now();
// Store initial location in Firestore
try {
await updateDoc(doc(db, 'Sales Rep', uid), {
Latitude: currentLocation.coords.latitude,
Longitude: currentLocation.coords.longitude,
Address: formattedAddress,
Timestamp: intialTimestamp,
});

// Add initial location to Location History subcollection
const locationHistoryRef = collection(db, 'Sales Rep', uid, 'Location History');
await addDoc(locationHistoryRef, {
Latitude: currentLocation.coords.latitude,
Longitude: currentLocation.coords.longitude,
Address: formattedAddress,
Timestamp: intialTimestamp,
});

console.log("Initial location stored in Firestore and Location History subcollection.");
isInitialLocationUpdated = true;

} catch (error) {
console.error("Error storing initial data in Firestore:", error);
}
}
};

getPermissionsAndLocation();
}, []);

// Network disconnected monitoring
useEffect(() => {
const unsubscribeNetInfo = NetInfo.addEventListener(async (state) => {
if (!state.isConnected || !state.isInternetReachable) {
// Optionally notify the admin
await sendNotificationToAdmin('Network disconnected');
}

});

return () => unsubscribeNetInfo();
}, []);

// Location services monitoring
useEffect(() => {
const checkLocationServices = async () => {
const isLocationEnabled = await Location.hasServicesEnabledAsync();
if (!isLocationEnabled) {
await sendNotificationToAdmin('Location services turned off');
}
};

const intervalId = setInterval(checkLocationServices, 60000); // Check every 1 minute
return () => clearInterval(intervalId);
}, []);

// Send notification to admin
const sendNotificationToAdmin = async (Message) => {
const uid = auth.currentUser.uid; // Get the current user's UID
const salesRepRef = doc(db, 'Sales Rep', uid); // Reference to the sales rep's document

try {
// Fetch the sales rep's profile data
const salesRepDoc = await getDoc(salesRepRef);

if (salesRepDoc.exists()) {
const { Name, Department } = salesRepDoc.data(); // Destructure Name and Department

// Add notification to AdminNotifications collection
const adminRef = collection(db, 'AdminNotifications');
await addDoc(adminRef, {
Department,
Message,
Name,
Timestamp: Timestamp.now(),
});

} else {
console.error('Sales Rep document not found');
}
} catch (error) {
console.error('Error fetching sales rep data:', error);
}
};

// Handle back button press
useEffect(() => {
const backAction = () => {
console.log("Back button pressed");
return true; // Prevent the default back button behavior
};

BackHandler.addEventListener("hardwareBackPress", backAction);

return () => BackHandler.removeEventListener("hardwareBackPress", backAction);
}, []);

}



Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-after-1
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»