ionic + cordova 插件和后台模式

Posted

技术标签:

【中文标题】ionic + cordova 插件和后台模式【英文标题】:ionic + cordova plugin and background mode 【发布时间】:2016-02-26 02:40:48 【问题描述】:

我正在为汽车司机制作一个带有 ionic 的应用程序。该应用程序每分钟获取一次坐标并将它们写入远程服务器,这有助于我跟踪路线并在 Google 地图上显示汽车。

我使用 Cordova 插件,它工作正常,除非屏幕关闭或应用程序进入后台。我安装了 katzer cordova-plugin-background-mode,当应用程序进入后台时,我看到消息:应用程序现在在后台,插件通知我,但没有别的,应用程序停止了! .

没有数据发送到远程服务器,当我恢复应用程序时一切恢复正常,我使用的是 android 平台。我该如何解决?

app.js 代码



angular.module('starter', ['ionic', 'ngCordova','LocalStorageModule', 'starter.controllers', 'starter.services'])

.run(function ($ionicPlatform) 
    $ionicPlatform.ready(function () 
        // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
        // for form inputs)
        if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) 
            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
        
        if (window.StatusBar) 
            // org.apache.cordova.statusbar required
            StatusBar.styleLightContent();
        

        cordova.plugins.backgroundMode.enable();

    );
)
.....

controllers.js



angular.module('starter.controllers', [])

.controller('GeoCtrl', function($scope, $cordovaGeolocation, $cordovaNetwork, $http, $interval) 


var reloadCoordinates = function() 

  var watchOptions = 
    timeout : 10000,
    enableHighAccuracy: false // may cause errors if true
  ;

  var watch = $cordovaGeolocation.watchPosition(watchOptions);

  watch.then(
    null,
    function(err) 
      // error

    ,
    function(position) 
      //Latitudine e Longitudine
      var lat  = position.coords.latitude
      var lon = position.coords.longitude

      $scope.latitude  = lat 
      $scope.longitude = lon


      $http.post('http://192.168.1.2/get-data.php',  "lat": lat, "lon" : lon ).then(function(resp) 
              console.log('Success Lat:'+resp.data.lat+' Lon:'+resp.data.lon);
              watch.clearWatch();

          , function(err) 
              console.error('ERR', err);
              // err.status will contain the status code
      )

  );


 ;//end reloadCoordinates


 $interval(reloadCoordinates, 60000);

 reloadCoordinates();

)

【问题讨论】:

请参考link 当我使用媒体播放器播放歌曲时,后台活动为我解决了 谢谢 Anil,我检查了一下,发现后台模式插件工作正常,具体取决于按下的智能手机按钮,例如在我的单页应用程序中:返回按钮 -> 从应用程序退出;主页按钮 - > 应用程序进入后台,图标出现在状态栏中。在这两种情况下,插件都会显示消息:应用程序在后台运行,这可能会使驱动程序在使用应用程序时感到困惑 好的,当你想使用地图时,你可以做一件事激活上面的插件代码 我也遇到了同样的问题,如果没有,我会在激活和停用插件时附上我的示例代码 【参考方案1】:

我知道这是一个旧线程,但我确实设法让它工作,使用:

cordova.plugins.backgroundMode.on('enable', function()
    //your code here, will execute when background tasks is enabled
    loop();
);

function loop()
    console.log("loop");
    $timeout(loop, 1000);


cordova.plugins.backgroundMode.enable();

【讨论】:

可能是一个愚蠢的问题,但是您将这些行放在哪里,导致我的主要引导类(MyApp)根本不吃它。 (对不起,我是 ionic 新手)【参考方案2】:

@克里斯蒂安, 启用插件后,你应该调用你的函数或在这个函数中编写你的逻辑。

    cordova.plugins.backgroundMode.onactivate = function() 
// your logic here
// or call any other service, factory function
;

【讨论】:

该功能不起作用,我放入其中的任何内容都不会显示。【参考方案3】:

您是否正在尝试制作一个每 x 分钟执行一次操作的应用,即使该应用在后台和/或屏幕已关闭....已插入...您是否找到了解决方案? 使用 cordova 命令行实用程序安装插件:

$ cordova plugin add https://github.com/boltex/cordova-plugin-powermanagement.git

这是我如何将它与后台模式插件一起使用,因此应用程序永远不会在后台运行,并且始终作为服务运行...:

if( ionic.Platform.isAndroid() )
cordova.plugins.backgroundMode.enable();

window.powerManagement.dim(function() 
  console.log('Wakelock acquired');
, function() 
  console.log('Failed to acquire wakelock');
);
window.powerManagement.setReleaseOnPause(false, function() 
  console.log('setReleaseOnPause successfully');
, function() 
  console.log('Failed to set');
);


最后一步在您完成服务后停用您的插件

cordova.plugins.backgroundMode.disable()

【讨论】:

以上是关于ionic + cordova 插件和后台模式的主要内容,如果未能解决你的问题,请参考以下文章

Cordova:在后台模式下扫描 iBeacons / BLE(iOS 和 Android)

在后台获取 Ionic/Cordova 应用程序的位置

Ionic Cordova:Push Notification 插件 onMessage 接收消息。

iOS 10 上的 Cordova 媒体插件是不是仍可使用后台播放?

京东支付cordova插件ionic1使用教程

即使手机被锁定/睡眠也能保持应用程序工作 - Ionic4