Андроиде. Собрал приложение, которое должно отслеживать позицию даже в фоне. Дал в настройках ОС для приложения все возможные разрешения. В AndroidManifest.xml добавил <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Но всё это не помогает.
Возниклам мысль, что так как я использую https://github.com/michalchudziak/react-native-geolocation, а это работает на уровне JS-движка, то возможно при убирании прилаги в фон, он приостанавливает своё выполнение (предположил, не уверен что так).
Прочитал что есть такая вещь https://github.com/transistorsoft/react-native-background-geolocation - типа нативный модуль для всего этого дела, однако это платно.
Суть вопроса - какие есть бесплатные решения для фоновой геолокации ?
Открыть npm и там искать, вот например что-то есть https://github.com/mauron85/react-native-background-geolocation
Я пробовал разные пакеты, однако ни один из них на последней версии RN у меня так и не запустился
А что за ошибки выдают? Может там в самих пакетах что-то поправить нужно
попробуйте посмотреть в сторону expo модулей, там есть модуль геолокации, который прекрасно работает https://docs.expo.dev/versions/latest/sdk/location/
благодарю, а expo-модули можно в bare-сборке использовать напрямую? Или нужны какие-то прослойки-хаки-костыли?
https://docs.expo.dev/bare/installing-expo-modules/
Делюсь решением своей проблемы по фоновой геолокации на Ведроиде. Спасибо @movpushmov за наводку. Библа https://docs.expo.dev/versions/latest/sdk/location/ из Экспо. В bare-варианте заводится по инструкции https://docs.expo.dev/bare/installing-expo-modules/ Рабочее решение для фоновой геолокации (здесь завязываемся на изменение координат) такое: import { useEffect } from 'react' import type { FC } from 'react' import * as Location from 'expo-location' import * as TaskManager from 'expo-task-manager' const App: FC = () => { // ... prev code useEffect(() => { (async () => { let { status } = await Location.requestForegroundPermissionsAsync() if (status !== 'granted') { console.error('Permission to access location was denied') return } TaskManager.defineTask('WATCH_BG_GEO', ({ data: { locations }, error }) => { if (error) return // // Your logic on change geolocation will be here // // Example - get lon and lat const newCoords = { lat: locations[0].coords.latitude, lon: locations[0].coords.longitude, } // Still works in background mode!! }) // Handler for changing geolocation Location.startLocationUpdatesAsync('WATCH_BG_GEO', { accuracy: Location.Accuracy.BestForNavigation, showsBackgroundLocationIndicator: true, timeInterval: 1000, activityType: Location.ActivityType.AutomotiveNavigation, distanceInterval: 1, foregroundService: { notificationTitle: 'GPS', notificationBody: ' enabled', } }) })() }, []) return ( // ... ) } export default App
Обсуждают сегодня