【问题标题】:react native ios: geoloc has poor accuracy by defaultreact native ios:geoloc默认精度差
【发布时间】:2017-09-23 13:56:20
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: ios iphone react-native geolocation w3c-geolocation


    【解决方案1】:

    我使用了https://github.com/timfpark/react-native-location,它使用 iOS 本地位置 api,并更新了我的代码,以便

    • 在 android 上,它保持不变并使用已经工作的 w3c 地理定位 api

    • 在 iOS 上,我开始使用上述 iOS 专用 api 进行跟踪,而不是使用 w3c geoloc 函数 'watchPosition'。要定期检索位置,来自 w3c geoloc 的 getPosition 仍然有效(正如在我的应用程序同时运行 strava 时所观察到的那样),所以我保留了它(如果不满意,可能会重构它以完全删除 iOS 上的 w3c api)。

    更新:经过很多用户的反馈,我对 Android 上 JS API watchPosition 的准确性并不满意。我的应用程序是一个健身追踪器,所以我需要非常高的准确性,但它可能会因您的需要而有所不同。我建议仔细测试,如果不满意,请改用原生 android API。

    【讨论】:

    • 嗨杰瑞米。 react-native-location 是一个好的解决方案吗?我有同样的问题。在 Android 中我实现了一个自定义类,但我试图在 iOS 中避免这种情况
    • 嗨 Uri Klar,在 android 上,我使用的是默认 gps api。 GPS 精度再次发生了很大变化,我们停用了该应用程序,直到我们有更多时间对其进行投资。如果我不得不再做一次,我想我会考虑使用卡尔曼滤波器或类似的方法来使用带 GPS 的加速度计。祝你好运!
    • 嗨,Jeremie,你在 iOS 上使用 react-native-location 比 geolocation 获得了更好的结果吗?我的应用程序还需要非常高的定位精度,而 geolocation.watchposition 还不够......
    • sorry ugrdursun,一年多前我放弃了这方面的开发。您可以使用这两种技术快速制作小型原型并比较结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2021-05-20
    • 1970-01-01
    • 2017-09-27
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多