react native ios: 默认情况下 geoloc 的准确性很差
react native ios: geoloc has poor accuracy by default
我正在使用 navigator.geolocation.watchPosition 和 getCurrentPosition 实现健身追踪器。它在 android 和 ios 模拟器上运行良好,精度为 5/10m,但在 iphone 5s 上,我的精度很差 (50/65)。
我发现当我在 ios 上同时 运行 一个现有的健身追踪器 (strava) 时,我的应用程序突然以非常准确的方式检索 GPS 坐标。
很明显我一定是缺少一些配置,因为默认情况下我的应用程序在 iOS 上不使用高精度。
知道如何解决这个问题吗?
代码:
const GPS_TIMEOUT_GET = 5000;
const GPS_MAX_AGE = 1000;
const GPS_DISTANCE_FILTER = 5;
const GPS_TIMEOUT_WATCH = 60000;
const GPS_MIN_ACCURACY = 50;
//start the GPS into full time watching. Drains battery but brings best accuracy (required for our needs)
let watchId = navigator.geolocation.watchPosition((position) => {
}
, (error) => {
console.log(error);
}
, {
enableHighAccuracy: true,
timeout: GPS_TIMEOUT_WATCH,
maximumAge: GPS_MAX_AGE,
distanceFilter: GPS_DISTANCE_FILTER
});
//check GPS every X milliseconds)
let intervalId = BackgroundTimer.setInterval(() => {
navigator.geolocation.getCurrentPosition((geoPosition) => {
if (geoPosition.coords.accuracy <= GPS_MIN_ACCURACY) {
let position = createPositionObjectFromGeoPosition(geoPosition);
dispatch({type: GPS_UPDATE_LOC, payload: position})
}
}
, (error) => {
console.log(error);
}
, {
enableHighAccuracy: true,
timeout: GPS_TIMEOUT_GET,
maximumAge: GPS_MAX_AGE
});
}, time);
Info.plist:
<key>NSLocationAlwaysUsageDescription</key>
<string>Your location is used to track your position during a ride and get feedback (distance ridden, duration, speed, etc) in real time and afterwards.</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
<string>location-services</string>
<string>gps</string>
</array>
我使用 https://github.com/timfpark/react-native-location,它使用 iOS 本机位置 api,并更新了我的代码,以便
在 android 上,它保持不变并使用已经有效的 w3c 地理定位 api
在 iOS 上,我开始使用上面的 iOS 专用 api 进行跟踪,而不是使用 w3c geoloc 函数 'watchPosition'。为了定期检索位置,来自 w3c geoloc 的 getPosition 仍然有效(当 运行 strava 与我的应用程序同时运行时观察到),所以我保留了它(可能重构它以完全删除 w3c api on iOS如果不满意稍后再说。
更新:经过许多用户反馈,我对 Android 上 JS API watchPosition 的准确性不满意。我的应用程序是一个健身追踪器,所以我需要非常高的准确性,但它可能会因您的需求而有所不同。我建议仔细测试它,如果不满意,请改用原生 android API。
我正在使用 navigator.geolocation.watchPosition 和 getCurrentPosition 实现健身追踪器。它在 android 和 ios 模拟器上运行良好,精度为 5/10m,但在 iphone 5s 上,我的精度很差 (50/65)。
我发现当我在 ios 上同时 运行 一个现有的健身追踪器 (strava) 时,我的应用程序突然以非常准确的方式检索 GPS 坐标。
很明显我一定是缺少一些配置,因为默认情况下我的应用程序在 iOS 上不使用高精度。 知道如何解决这个问题吗?
代码:
const GPS_TIMEOUT_GET = 5000;
const GPS_MAX_AGE = 1000;
const GPS_DISTANCE_FILTER = 5;
const GPS_TIMEOUT_WATCH = 60000;
const GPS_MIN_ACCURACY = 50;
//start the GPS into full time watching. Drains battery but brings best accuracy (required for our needs)
let watchId = navigator.geolocation.watchPosition((position) => {
}
, (error) => {
console.log(error);
}
, {
enableHighAccuracy: true,
timeout: GPS_TIMEOUT_WATCH,
maximumAge: GPS_MAX_AGE,
distanceFilter: GPS_DISTANCE_FILTER
});
//check GPS every X milliseconds)
let intervalId = BackgroundTimer.setInterval(() => {
navigator.geolocation.getCurrentPosition((geoPosition) => {
if (geoPosition.coords.accuracy <= GPS_MIN_ACCURACY) {
let position = createPositionObjectFromGeoPosition(geoPosition);
dispatch({type: GPS_UPDATE_LOC, payload: position})
}
}
, (error) => {
console.log(error);
}
, {
enableHighAccuracy: true,
timeout: GPS_TIMEOUT_GET,
maximumAge: GPS_MAX_AGE
});
}, time);
Info.plist:
<key>NSLocationAlwaysUsageDescription</key>
<string>Your location is used to track your position during a ride and get feedback (distance ridden, duration, speed, etc) in real time and afterwards.</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
<string>location-services</string>
<string>gps</string>
</array>
我使用 https://github.com/timfpark/react-native-location,它使用 iOS 本机位置 api,并更新了我的代码,以便
在 android 上,它保持不变并使用已经有效的 w3c 地理定位 api
在 iOS 上,我开始使用上面的 iOS 专用 api 进行跟踪,而不是使用 w3c geoloc 函数 'watchPosition'。为了定期检索位置,来自 w3c geoloc 的 getPosition 仍然有效(当 运行 strava 与我的应用程序同时运行时观察到),所以我保留了它(可能重构它以完全删除 w3c api on iOS如果不满意稍后再说。
更新:经过许多用户反馈,我对 Android 上 JS API watchPosition 的准确性不满意。我的应用程序是一个健身追踪器,所以我需要非常高的准确性,但它可能会因您的需求而有所不同。我建议仔细测试它,如果不满意,请改用原生 android API。