cordova - 应用程序在后台时地理定位超时

cordova - geolocation timed out when app in background

我在 cordova 上创建了一个应用程序,这是一个社交网络,可以在地图上找到朋友。当应用程序在前台时,地理定位工作正常(使用 cordova-plugin-geolocation 插件)。 但我也希望它在应用程序在后台运行时工作。为此,我正在使用 cordova-plugin-background-mode,以这种方式工作:

var geolocID;
window.onload = function(){
        document.addEventListener("deviceready", init, false);
        document.addEventListener("resume", function() { console.log("resume with id :" + geolocID); navigator.geolocation.clearWatch(geolocID); init();},false);
        document.addEventListener("pause", geolocBackground,false);//function() {setTimeout(function(){console.log("TEST");},5000)},false);
    }

    function geolocBackground()
    {
        console.log("In geolocaBackground " + ", ID = " + geolocID);
        navigator.geolocation.clearWatch(geolocID);
        console.log("ID = " + geolocID);

        geolocID = navigator.geolocation.watchPosition(positionSuccessBackground,positionError,{timeout: 5000});
        console.log("Geolocation end");
    }


    function init()
    {
        geolocID = navigator.geolocation.watchPosition(positionSuccess, positionError, {enableHighAccuracy: true, timeout: 60000, frequency: 10000});

        cordova.plugins.backgroundMode.enable();
        cordova.plugins.backgroundMode.onactivate = function(){console.log("Backgound mode activated");
                                                                cordova.plugins.backgroundMode.configure({silent: false});
                                                                };
        cordova.plugins.backgroundMode.ondeactivate = function() {console.log("Backgound mode disabled");};
    }

似乎 bacgkound 模式有效,因为当我暂停应用程序时,我的控制台中有这个:

 In geolocaBackground , ID = 707e54f8-fb99-fb36-2855-341b45f3d774
 ID = 707e54f8-fb99-fb36-2855-341b45f3d774
 Geolocation end
 resume with id :707e54f8-fb99-fb36-2855-341b45f3d774

但是地理定位不起作用,返回超时错误,代码 3.. 我不明白我的代码有什么问题,我在网上没有找到任何东西。应用程序似乎无法在后台访问phone 的位置信息。代码已执行,但只有定位功能不起作用。如果有人对这个问题有所了解,将不胜感激:) 感谢您的帮助,问候

希望这与我遇到的问题相同。我的代码如下: start() { cordova.plugins.backgroundMode.enable(); var gpsOptions = { maximumAge: 2000, timeout: 5000, enableHighAccuracy: true }; document.addEventListener('deviceready', function () { var GpsLog = []; this.gpsChecker = Observable.timer(0, 4000); this.gpsChecker.subscribe(() => { navigator.geolocation.getCurrentPosition(position => { var deviceLog = { type: 'Device Location', value: position.coords.longitude + "," + position.coords.latitude } this._api.uploadLog(deviceLog); }, null, gpsOptions); }); }); }

(我用的是 ionic 2 和 typescript 但原理是一样的)。问题似乎是(无论如何我的)是当你的应用程序在后台时它没有 'priority' 访问设备 GPS 位置。也就是说,当我的应用程序进入后台时,我必须在外面走动(大约 15 米)才能获得地理定位,如果应用程序在前台 运行,我每隔几秒就会获得一次地理定位。尝试降低你的超时时间和你的最大年龄参数,并带着设备在晴朗的天空中散步。

这是一个 chromium 错误,请查看:

https://bugs.chromium.org/p/chromium/issues/detail?id=585055

感谢您的回答。 无论是否使用 chrome,或者步行几米,我都没有成功地在后台进行地理定位。 我通过在 Java 中编码 Android 服务和 gps 跟踪器自己解决了这个问题,所以当应用程序关闭时我的应用程序仍然跟踪我的用户。