使用cordova-plugin-background-mode在后台模式下进行位置检测和HTTP调用

时间:2016-03-19 23:03:18

标签: cordova background geolocation

我有一个离子应用程序,当应用程序位于前台时,应用程序的行为方式如下。应用程序中的服务每隔x秒使用navigator.geolocation检查地理位置,并根据它调用另一个服务的坐标来执行一些http调用。现在,当应用程序处于后台时,这些事情显然不起作用,但是我的应用程序能够执行这些检测并进行这些调用非常重要(其中包括更改service.js中的一些变量)

到目前为止,我的app.js中有以下代码。

document.addEventListener('deviceready', function () {
    // Android customization
    cordova.plugins.backgroundMode.setDefaults({     title:  "XYZ",
    ticker: "XYZ is running on background",
    text:   "XYZ is keeping track now on the background. This is a test message"});
    // Enable background mode
   cordova.plugins.backgroundMode.enable();

cordova.plugins.backgroundMode.onfailure = function(errorCode){
    console.log("failed")
};

// Called when background mode has been activated
cordova.plugins.backgroundMode.onactivate = function () {

      console.log("Hello from background!); // works fine


      ////////////////// This piece of code doesn't execute /////////////
      function success(position){
       console.log("In success function");
       MyService.doStuff(); // This will make some http calls
      }

       function success(position){
       console.log("In success function");
       MyService.doStuff(); // This will make some http calls
      }

       function error(error){
       console.log("In error function");
      }

       var options = {timeout: 60000, enableHighAccuracy: true}; // options for checking geolocation

       navigator.geolocation.getCurrentPosition(success, error, options); // eventually I'd like to add setInterval to this piece, so it executes every x seconds
      //////////////////////////////////////////////////////////////////

}

cordova.plugins.backgroundMode.ondeactivate = function() {
  console.log("Bye Bye from Background!"); // works fine
};


}, false);

如果这样可行,我应该能够在函数和setInterval中包装该片段,因此每x秒检查一次该位置。任何人都可以建议我如何在后台进行这项工作。当我在前台执行此操作时,它工作正常。

Android:5.1.1

1 个答案:

答案 0 :(得分:1)

@Purpamine,
好消息是你在许多开发人员绊倒的情况下取得了成功。

使用Cordova / Phonegap,大多数需要完成的事情(在移动设备上)都是以三种方式之一完成的:

  1. Javascript库
  2. Cordova"核心"插件
  3. 第三方插件
  4. 在您的情况下,您正在使用"核心" geolocation library。如果您在Cordova Plugin repository搜索geolocation(此时),您会找到24个插件。添加关键字background,您将离开9 plugins。这些插件中的大多数都适用于Android和iOS。目前,似乎没有适用于 * winphone * 地理位置背景插件。由于我没有完成这项任务(背景),我现在不能推荐任何插件。

    您应该知道其中许多插件都基于"核心"图书馆,你所做的大部分工作仍然有效。

    最后一件事是,我在几个月前(2015年11月28日)发表了from a post

    HEADS UP:Android 6.0 SDK-23阻止后台操作。

      

    从Android 6.0 SDK-23(Marshmallow)开始,Google正在实施影响后台运营的新功能/障碍。这两个(2)是相关的,称为 DOZE App Suspend 。这些新功能的重点是#34;是为了节省电池寿命。

         

    在最糟糕的情况下,即时消息将被丢弃。在另一种情况下,您的应用每天只能使用 的网络或后台操作。在另一种情况下,您可以每15分钟进行一次操作。在最好的情况下,您可以获得精确的时间操作,但JobScheduler之类的内容仍然会失败。

         

    哦,我找到的whitelist列表参考是让最终用户将您的应用添加到移动设备上的whitelist。这意味着您可以要求最终用户将您的应用放在白名单中,这样您就可以部分忽略 DOZE App Suspend

         

    然而,(谷歌)文档警告:

         
        

    注意:除非应用程序的核心功能受到不利影响,否则Google Play政策会禁止应用程序直接豁免Android 6.0+(Doze和App Standby)中的电源管理功能。

      
         

    我已经对此做了初步调查,我发现很少有文章,博客文章或SO帖子。 (...)与此同时,我有笔记   Android 6.0 & Doze

         

    Android(官方) Optimizing for Doze and App Standby