如果 gps 暂时不可用,Cordova 地理定位插件无法正常工作

Posted

技术标签:

【中文标题】如果 gps 暂时不可用,Cordova 地理定位插件无法正常工作【英文标题】:Cordova geolocation plugin not working correctly if gps not available for a moment 【发布时间】:2015-09-03 15:08:39 【问题描述】:

在我的 angularjs/ionic 应用程序中,我将跟踪服务作为后台服务运行。

为此,我运行了一个地理定位手表。好吧,如果由于某种原因设备(Iphone 5s)没有收到 gps 信号,那么应用程序在此之后就无法获得任何 gps 信号。无论设备在哪里。恢复跟踪服务的唯一方法是打开默认地图应用程序。在地图应用程序找到我的位置后,我的应用程序也收到了 gps 信号。解释问题很复杂,如果我不能很好地解释问题,很抱歉。

我的代码如下所示:

var startWatch = function() 

  var watchOptions = 
    frequency : trackingFrequency*1000,
    timeout : 60*60*1000,
    maximumAge: 10*1000,
    enableHighAccuracy: true // may cause errors if true
  ;

  //watch = $cordovaGeolocation.watchPosition(watchOptions);
  watch = navigator.geolocation.watchPosition(on_success,on_error,watchOptions);
;

var on_error = function(err) 
  alert("Bitte schalten Sie die Ortungsdienste ein und starten Sie die Applikation neu.");
  startWatch();
;

我尝试了两个插件,来自 ngcordova 的 $cordovaGeolocation 插件和默认插件,但两种情况下的行为是相同的。如果我丢失了 gps 信号,它会完全丢失,直到我使用本机应用程序启动 gps 跟踪。我在安卓和ios上测试过,安卓运行也出现同样的问题。

保持跟踪服务正常运行的唯一方法是留在 GPS 信号良好的区域,这不是一个好的解决方案。

那么我错过了什么?

感谢您的帮助

【问题讨论】:

当您说“应用程序无法获取任何 gps 信号”时,这是否意味着 on_error 函数被调用(如果是这样,错误代码是什么)或者 on_successon_error 再次被调用? 是的,on_success 或 on_error 都不会再次被调用。如果我将超时更改为一个小值,就会调用 on_error 函数。 60*60*1000 的超时时间太长 - 1 小时后才会调用 on_error;允许 GPS 获取的实际值更像是 30000(30 秒)。传递给 on_error() 的错误代码是什么? 您还说“我正在将跟踪服务作为后台服务运行”。您是在使用background geolocation plugin 还是在 android 上实现了自定义 Java 服务并在 iOS 上手动将后台模式注册为位置? 不,我使用github.com/katzer/cordova-plugin-background-mode 作为后台服务,但我编写了自己的跟踪服务来处理 watch 和 getposition 事件。在我的 on_error 函数中,我尝试再次启动手表,但如果它运行一次进入错误函数,它不会退出,这就是为什么我使用 1 小时作为错误函数。 【参考方案1】:

传递给on_error 的错误对象中应该有错误代码和/或消息。这应该告诉您正在发生什么类型的错误(我假设它是 TIMEOUT)。错误码值对应PositionError object:

PositionError.PERMISSION_DENIED = 1;
PositionError.POSITION_UNAVAILABLE = 2;
PositionError.TIMEOUT = 3;

另外,当尝试重置错误的观察者时,请确保在添加另一个观察者之前清除现有的观察者。所以尝试这样的事情:

var watch = null;
var startWatch = function() 

  var watchOptions = 
    frequency : trackingFrequency*1000,
    timeout : 30*1000,
    maximumAge: 10*1000,
    enableHighAccuracy: true // may cause errors if true
  ;

  if(watch !== null)
    navigator.geolocation.clearWatch(watch);
  
  watch = navigator.geolocation.watchPosition(on_success,on_error,watchOptions);
;

var on_error = function(err) 
  alert("Bitte schalten Sie die Ortungsdienste ein und starten Sie die Applikation neu." + "\ncode: " + err.code + "\nmessage: " + err.message);
  startWatch();
;

【讨论】:

那么在手表上使用较小的超时时间并手动重启手表而不是等待具有较大超时时间的信号会更好吗? 这就是我在使用地理定位的科尔多瓦应用程序中执行此操作的方式,并且它似乎有效。设置较小的超时时间意味着您可以在 GPS 信号出现问题时尽快收到通知并做出响应。 例如,在 Android 上,如果用户关闭 GPS(将位置模式设置为省电模式)然后重新打开(将位置模式设置为高精度),cordova 应用将不会收到位置更新,直到手表被删除然后再次添加。

以上是关于如果 gps 暂时不可用,Cordova 地理定位插件无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 地理定位插件问题

Cordova 地理定位插件有时不工作

Cordova 地理定位插件无法从 Android 的 GPS 获取位置

移动地理定位精度 - cordova / phonegap

基于gps或gprs(ip)的地理定位

基于 gps 或 gprs(ip) 的地理定位