当PhoneGap应用在后台运行时,通过Geolocation API每隔一段时间获取设备位置的方法。

5
我使用PhoneGap编写了一个应用程序,通过地理位置API跟踪您的行程路线。我通过navigator.geolocation.getCurrentPosition(onSuccess, onError);获取设备的当前位置,然后通过navigator.geolocation.watchPosition(function(position)定时获取位置信息并更新折线图。
但问题是在程序后台运行时(即打开其他应用程序并将其放到后台),它就无法更新折线图,也就不能触发navigator.geolocation.watchPosition(function(position)函数。因此,我尝试使用Cordova-plugin-background-mode来运行应用程序,但这个插件也没能触发navigator.geolocation.watchPosition(function(position)函数,意味着不需要安装此插件也可以在后台模式下运行应用程序。所以,请帮助我解决后台模式下获取位置的问题。如果我使用Cordova-plugin-mauron85-background-geolocation插件,如何像使用watch position一样获取位置?如果应用程序在前台运行怎么办?我还需要使用watchPosition函数吗?
2个回答

1
你可能想深入了解这个位置插件。他们似乎认为他们已经解决了这个问题。
一个快速的fiddle和我可以访问的手机测试显示这不是一个PhoneGap问题,而是一个操作系统问题。大多数手机都已经优化了挂起后台活动,特别是网页浏览器活动。最好还是绑定本地事件来获得所需的行为。
navigator.geolocation.watchPosition( positionChanged, err, options );

我注意到手机即使在后台任务中也保持着所有连接。你可以通过向一个不拒绝但不回应的服务器发起一个ajax调用,设定一个超时处理程序,并设置所需的时间间隔来应对这种情况,在ajax的超时处理程序中检查位置,然后设定一个新的调用。

祝你好运!


@everyone 如果你尝试在后台执行间隔的ajax hack,请告诉我们。 - N-ate

0

这里有一个使用 cordova-plugin-background-mode 的示例:

var backgroundGeoLocation = window.plugins.backgroundGeoLocation;

function startGetLocation() {

var callbackFn = function(location) {
    console.log('[js] BackgroundGeoLocation callback:  ' + location.latitude + ',' + location.longitude);
    var latitude = location.latitude;
    var longitude = location.longitude;
    var pontos = [];
    if($localStorage.getPontosGps() && $localStorage.getPontosGps().pontos){
      pontos = $localStorage.getPontosGps().pontos;
    }


    $log.log('lat: ' + latitude);
    $log.log('long: ' + longitude);

    if (!_.find(pontos, {
        latitude: latitude,
        longitude: longitude
      })) {

      pontos.push({
        latitude: latitude,
        longitude: longitude,
        velocidade: null
      });

      $localStorage.setPontosGps({
        isRunning: true,
        pontos: pontos
      });
    }
    backgroundGeoLocation.finish();
  };

  var failureFn = function(error) {
    console.log('BackgroundGeoLocation error: ' + error);
  };

  backgroundGeoLocation.configure(callbackFn, failureFn, {
    desiredAccuracy: 10,
    stationaryRadius: 20,
    distanceFilter: 30,
    debug: false,
    stopOnTerminate: false,
    locationTimeout: 10,
    notificationTitle: 'Title', // <-- android only, customize the title of the notification
    notificationText: 'Collecting geolocation'
  });

  backgroundGeoLocation.start();

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接