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

Posted

技术标签:

【中文标题】在后台获取 Ionic/Cordova 应用程序的位置【英文标题】:Get location in Ionic/Cordova app when in background 【发布时间】:2016-01-11 18:04:05 【问题描述】:

如果我关闭 Ionic/Cordova 应用程序(适用于 iosandroid),是否可以运行后台服务?

为此我选择了那个插件https://github.com/katzer/cordova-plugin-background-mode

到目前为止,我有那个代码:

$ionicPlatform.ready(function () 
            cordova.plugins.backgroundMode.isEnabled();

            cordova.plugins.backgroundMode.configure(
                silent: true
            ) 
              ............
            ///do some task
)

如果应用程序进入前台,它可以正常工作,但是一旦我关闭应用程序,我正在运行的任务也会停止。 那么即使应用程序关闭,是否有任何解决方法/方法可以使我的任务运行?

编辑:

我还为 iOS 和 Andorid 添加了权限,但我得到了相同的结果。

编辑 2:

我在后台尝试做的是编写自己的重要位置更改服务实现,因为没有适用于 iOS 和 Android 的 Cordova 或 PhoneGap 的免费插件。

【问题讨论】:

你有解决办法吗? 你有什么解决办法吗?同样在这里找东西 【参考方案1】:

Ionic Framework

我最近在我的项目中实现了这样的功能。我确实使用了 Ionic,并且确实使用了 Katzer 的 Cordova 插件背景模式。 (现在我正在通过 iOS 9.2 模拟器运行后台进程)。

这里有一个代码 sn-p 让它工作:

// Run when the device is ready
document.addEventListener('deviceready', function () 

    // Android customization
    // To indicate that the app is executing tasks in background and being paused would disrupt the user.
    // The plug-in has to create a notification while in background - like a download progress bar.
    cordova.plugins.backgroundMode.setDefaults( 
        title:  'TheTitleOfYourProcess',
        text:   'Executing background tasks.'
    );

    // Enable background mode
    cordova.plugins.backgroundMode.enable();

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

        // Set an interval of 3 seconds (3000 milliseconds)
        setInterval(function () 

            // The code that you want to run repeatedly

        , 3000);
    
, false);

Ionic Framework 2

这是一个准备好 ES6 的 Ionic 2 示例:

// Import the Ionic Native plugin 
import  BackgroundMode  from 'ionic-native';

// Run when the device is ready
document.addEventListener('deviceready', () => 

    // Android customization
    // To indicate that the app is executing tasks in background and being paused would disrupt the user.
    // The plug-in has to create a notification while in background - like a download progress bar.
    BackgroundMode.setDefaults( 
        title:  'TheTitleOfYourProcess',
        text:   'Executing background tasks.'
    );

    // Enable background mode
    BackgroundMode.enable();

    // Called when background mode has been activated
    // note: onactive now returns an returns an observable that emits when background mode is activated
    BackgroundMode.onactivate.subscribe(() => 
          // The code that you want to run repeatedly
    );
, false);

【讨论】:

即使您完全关闭应用程序也能正常工作? 如果您像“将其移至后台”一样关闭应用程序,它将起作用。 如果这个人关掉手机(我的意思是完全关机并重新启动),那么将你的代码放回游戏需要什么?我知道所有的闹钟应用都能做到这一点。 @AverageJoe 我认为这几乎是不可能的,或者您需要将值写入重新启动后保留的内存或 NoSQL 数据库等其他数据源。 既然报警应用可以做到这一点,我怀疑一定有办法。我刚在我的安卓手机上试过这个; 1)设置警报3分钟以备后用。 2) 将手机完全关机。 3)然后启动它然后繁荣,我3分钟前设置的警报启动了。(当时,警报应用程序不在“正在运行的应用程序”中,但警报本身能够触发。)【参考方案2】:

我认为您尝试实现的后台地理定位跟踪已经作为cordova插件存在,它被称为cordova-plugin-mauron85-background-geolocation。

这个插件既是前台也是后台的地理定位服务。与 html5 地理定位或 cordova-geolocation 插件相比,它的电池和数据效率要高得多。

有很多配置选项,见上面链接的github页面。

【讨论】:

【参考方案3】:

IONIC-3 的解决方法

导入插件

import  Platform  from 'ionic-angular';
import  BackgroundMode  from '@ionic-native/background-mode';

添加构造函数

constructor(private backgroundMode: BackgroundMode, private plt: Platform) 
    this.initBackgroundMode();


private initBackgroundMode() 
    this.plt.ready().then(() => 
        this.backgroundMode.setDefaults( silent: true );
        this.backgroundMode.enable();
        if (this.plt.is("android")) 
            this.backgroundMode.on('activate').subscribe(() => 
                this.backgroundMode.disableWebViewOptimizations();
                // Custom code for updating the location 
                // or do similar functionality
                // use timeout or interval accordingly to execute the functionality in loop
            );
        
    )

【讨论】:

如果您的应用已关闭且不在后台运行,这是否有效?! @Rebar 后台活动仅在应用程序处于后台时才会发生。上面的代码不支持被杀死的应用程序或不在后台运行。

以上是关于在后台获取 Ionic/Cordova 应用程序的位置的主要内容,如果未能解决你的问题,请参考以下文章

Ionic/Cordova 应用程序不会在后台收到推送通知

Ionic / Cordova:如何强制应用程序在启动时刷新,即使它在后台?

当应用不在前台时,Ionic / Cordova 触发应用操作

如何在 ionic cordova 应用程序中获取 SIM 信息

如何在 Ionic3、Cordova 和 Angular4 应用程序中获取 android 设备的语言?

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