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

Posted

技术标签:

【中文标题】使用 cordova-plugin-background-mode 在后台模式下进行位置检测和 HTTP 调用【英文标题】:Location detection and HTTP call on background mode using cordova-plugin-background-mode 【发布时间】:2016-03-19 23:03:18 【问题描述】:

我有一个 ionic 应用程序,当它处于前台时,该应用程序的行为方式如下。应用程序中的服务使用 navigator.geolocation 每隔 x 秒检查一次地理位置,并根据坐标调用另一个服务来执行一些 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);

如果这可行,我应该能够将片段包装在一个函数中,并设置间隔,因此每隔 x 秒检查一次位置。谁能建议我如何在后台进行这项工作。当我在前台执行此操作时,它工作正常。

安卓:5.1.1

【问题讨论】:

您使用的是 Anroid 6.0 吗?如果是这样,请将该信息放入您的消息中。 我的版本是安卓5.1.1 嗯...好的。我以为你可能有一个 Android 6.0 功能工作。但你的问题可能是别的。我现在要仔细看看你的帖子。这是可能会阻止您的工作的 6.0 功能Android 6.0 & doze 好的。我又看了你的消息。既有后台插件,也有 Geolocation 的后台服务。但是,您需要考虑到您的应用程序将停止与 Android 6.0 一起使用。你想要答案吗? 请。我现在能得到的任何信息对我来说都非常重要。谢谢。 【参考方案1】:

@Purpamine, 好消息是,您在许多开发人员绊脚石的地方取得了成功。

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

    javascript 库 Cordova“核心”插件 第三方插件

在您的情况下,您使用的是“核心”geolocation library。如果您在Cordova Plugin repository 中搜索geolocation(此时),您将找到24 个插件。添加关键字background,您将得到9 plugins。这些插件中的大多数都适用于 Android 和 ios。目前,似乎没有适用于 *winphone*geolocation background 插件。由于我没有从事此任务(背景),因此我目前无法推荐任何插件。

你应该知道,这些插件很多都是基于“核心”库的,所以你所做的很多工作仍然有效。

最后一件事,下面是我几个月前(2015 年 11 月 28 日)制作的 from a post。

注意:Android 6.0 SDK-23 阻止后台操作。

从 Android 6.0 SDK-23 (Marshmallow) 开始,Google 正在实施影响后台操作的新功能/障碍。这两个 (2) 是相关的,分别称为 DOZEApp Suspend。这些新“功能”的重点是节省电池寿命。

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

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

但是,(谷歌)文档警告:

注意:除非应用的核心功能受到不利影响,否则 Google Play 政策禁止应用请求直接豁免 Android 6.0+(打盹和应用待机)中的电源管理功能。

我已经对此进行了初步研究,但发现的文章、博客文章或 SO 线程很少。 (...) 与此同时,我在 Android 6.0 & Doze

Android(官方) Optimizing for Doze and App Standby

【讨论】:

好的。那么我从中得到的是,您是要我研究这些 3rd-party 插件并利用它们而不是使用核心功能吗? 是的,你应该看看 3rd-party 插件。此外,所有制造商都在限制后台操作,因为它们会耗尽电池寿命——最终用户的第一大抱怨。不用说,您做出的任何决定都可能充满麻烦。因此,我还建议您考虑可能(或可能不需要)在 6-18 个月内重写您的应用程序 - 这与电池使用有关。祝你好运。 谢谢。应用程序应该是在开车时使用的,所以不用太担心电池,因为它可以在开车时插上电源。 我明白了。这是你要处理的。我只是告诉你情况。祝你好运

以上是关于使用 cordova-plugin-background-mode 在后台模式下进行位置检测和 HTTP 调用的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)