web-dev-qa-db-fra.com

Obtenir l'emplacement dans l'application Ionic / Cordova en arrière-plan

Est-il possible d'exécuter un service d'arrière-plan si je ferme mon application Ionic/Cordova (à la fois pour iOS et Android)?

Dans le but, j'ai choisi ce branchement https://github.com/katzer/cordova-plugin-background-mode

Jusqu'à présent, j'ai ce code:

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

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

Cela fonctionne bien si l'application passe au premier plan, mais dès que je ferme l'application, la tâche que j'exécute s'arrête également. Existe-t-il une solution/un moyen de faire fonctionner ma tâche même si l'application est fermée?

MODIFIER:

J'ai également ajouté des autorisations pour iOS et Andorid mais j'obtiens le même résultat.

EDIT 2:

Ce que j'essaie de faire en arrière-plan est d'écrire ma propre implémentation d'un service de changement de localisation important car il n'y a pas de plugin gratuit pour Cordova ou PhoneGap qui peut fonctionner avec iOS et Android.

33
radioaktiv

Cadre ionique

J'ai récemment implémenté une fonctionnalité comme celle-ci dans mon projet. J'ai utilisé Ionic et j'ai utilisé le mode d'arrière-plan du plug-in Cordova de Katzer. (En ce moment, j'exécute le processus d'arrière-plan via le simulateur iOS 9.2).

Voici un extrait de code pour le faire fonctionner:

// 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);

Cadre ionique 2

Voici un Ionic 2 exemple ES6 prêt:

// 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);
13
0x1ad2

Je pense que le suivi de la géolocalisation en arrière-plan que vous essayez d'implémenter existe déjà en tant que plugin cordova, il s'appelle cordova-plugin-mauron85-background-geolocation .

Ce plugin est à la fois un service de géolocalisation de premier plan et d'arrière-plan. Il est beaucoup plus efficace en termes de batterie et de données que le plugin de géolocalisation html5 ou de cordova-géolocalisation.

Il existe de nombreuses options de configuration, voir la page github liée ci-dessus.

2
theDmi

Solution de contournement sur IONIC-3

importer les plugins

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

ajouter un constructeur

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
            });
        }
    })
}
0
Jose G Varanam