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 跟踪器自己解决了这个问题,所以当应用程序关闭时我的应用程序仍然跟踪我的用户。
我在 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 跟踪器自己解决了这个问题,所以当应用程序关闭时我的应用程序仍然跟踪我的用户。