Следуйте за местоположением пользователя на React Native AirBnb MapView [Android]
Я использую airbnb map для реагирования в своем приложении. Этот вопрос предназначен для приложения для Android, так как я еще не обошел приложение iOS.
Моя проблема:
navigator.geolocation отлично работает на эмуляторе, но слишком долго работает на реальных устройствах, до такой степени, что иногда это случается на более старых устройствах.
Что я заметил:
если showsUserLocation
prop установлен в значение true, я могу увидеть маркер "текущей позиции" на карте до getCurrentPosition решает.
Что я хочу:
- Я хочу, чтобы мой регион всегда был ориентирован на местоположение пользователя.
- Я хочу либо получить доступ к родной геолокации api (должен быть
быстрее?), или, может быть, кто-то скажет мне, что я делаю неправильно. Ниже приведено
образец кода.
- Я хочу по-прежнему обнаруживать местоположение пользователя даже после включения/выключения служб определения местоположения. Это поведение
showsUserLocation
prop, но он кажется, что когда-то ошибки watchPostion, он полностью останавливается.
Вот что я до сих пор, это очень просто:
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
console.log("getCurrentPosition Success");
this.setState({
region: {
...this.state.region,
latitude: position.coords.latitude,
longitude: position.coords.longitude,
}
});
this.props.resetNotifications();
this.watchPosition();
},
(error) => {
this.props.displayError("Error dectecting your location");
alert(JSON.stringify(error))
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
}
watchPosition() {
this.watchID = navigator.geolocation.watchPosition(
(position) => {
console.log("watchPosition Success");
if(this.props.followUser){
this.map.animateToRegion(this.newRegion(position.coords.latitude, position.coords.longitude));
}
},
(error) => {
this.props.displayError("Error dectecting your location");
},
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
}
Ответы
Ответ 1
Я всегда находил watchPosition
iffy между разными браузерами, одна вещь, которая работала для меня раньше, - это заменить getCurrentPosition
внутри a setInterval
так, чтобы она получала местоположение каждые несколько секунд, и если она терпит неудачу один раз он повторит следующий интервал, в отличие от watchPosition
, который перестает смотреть, происходит ли ошибка.
В общем случае геолокация браузера не очень надежна, вы можете проверить этот поток для некоторых проблем https://github.com/facebook/react-native/issues/7495
Другая альтернатива, которая, безусловно, будет более быстрой и, возможно, более надежной, - использовать собственный API геолокации. Проверьте этот вопрос для библиотек, которые выставляют родную геолокацию для реагирования на родную локальную геолокацию Android.
Ответ 2
Не уверен, что это решит вашу проблему, но попробуйте следующее:
navigator.geolocation.getCurrentPosition(
(position) => {
console.log("getCurrentPosition Success");
this.setState({
region: {
...this.state.region,
latitude: position.coords.latitude,
longitude: position.coords.longitude,
}
}, () => {
this.props.resetNotifications();
this.watchPosition();
});
},