Получение местоположения в приложении Ionic / Cordova в фоновом режиме

Можно ли запустить фоновую службу, если я закрою приложение Ionic / Cordova (как для iOS, так и для Android)?

Для этой цели я выбрал это подключение 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:

Что я пытаюсь сделать в фоновом режиме, так это написать свою собственную реализацию службы значительного изменения местоположения, поскольку нет бесплатного плагина для Cordova или PhoneGap, который мог бы работать как с iOS, так и с Android.


person radioaktiv    schedule 13.10.2015    source источник
comment
Вы нашли какое-нибудь решение?   -  person Muhsin Keloth    schedule 23.10.2015
comment
Получили ли вы какое-либо решение ?, здесь же что-то ищите   -  person Nico    schedule 22.10.2016


Ответы (3)


Ionic Framework

Недавно я реализовал такую ​​функцию в своем проекте. Я использовал Ionic, и я использовал фоновый режим плагина Cordova от Katzer. (прямо сейчас я запускаю фоновый процесс через симулятор iOS 9.2).

Вот фрагмент кода, чтобы заставить его работать:

// 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);
person 0x1ad2    schedule 14.12.2015
comment
И это работает, даже если вы полностью закроете приложение? - person radioaktiv; 14.12.2015
comment
Если вы закроете приложение, переместив его в фоновый режим, оно будет работать. - person 0x1ad2; 15.12.2015
comment
Что, если человек выключит телефон (я имею в виду полное выключение и перезагрузку), что потребуется, чтобы вернуть ваш код в игру? Я знаю, что все приложения для будильников достигают этого. - person Average Joe; 05.01.2016
comment
@AverageJoe Я думаю, что это почти невозможно, или вам нужно записывать значения в память, которая сохраняется после перезапуска, или из другого источника данных, например, базы данных NoSQL. - person 0x1ad2; 05.01.2016
comment
Поскольку приложения для сигнализации могут это делать, я подозреваю, что способ должен быть. Я только что попробовал это на своем телефоне Android; 1) установить будильник на 3 мин позже. 2) Полностью выключите телефон. 3) И загрузите его, а затем бум, сработал тот будильник, который я установил 3 минуты назад. (В то время приложение будильника не было среди запущенных приложений, но сам будильник мог сработать.) - person Average Joe; 09.01.2016
comment
Я думаю, это связано с тем, что приложение-будильник должно быть настроено на запуск в фоновом режиме при загрузке устройства. Подобно запускаемым приложениям в Windows. - person Mikecit22; 23.02.2016
comment
@ 0x1ad2 Я тоже пробовал код на ionic с Iphone. Могу ли я просто поместить код в $ ionicPlatform.ready (function () {}? Что-нибудь еще? - person UniSound Waterloo; 26.02.2016
comment
@UniSoundWaterloo прошло пару месяцев, поэтому я не уверен, что он все еще работает, но я бы попытался поместить код в контроллер. github.com/katzer/cordova-plugin-background-mode - person 0x1ad2; 26.02.2016
comment
Привет .. Я использовал тот же плагин. но когда я открываю другое приложение, мое приложение не работает в фоновом режиме. Также он перезапускается при открытии. Пожалуйста, дайте мне знать, если я что-то упустил. заранее спасибо - person AishApp; 11.08.2016
comment
Можем ли мы вызвать локальное уведомление ... ?? - person Gopinath Kaliappan; 28.10.2016
comment
Это сработает, если я закрою приложение, например Whatsapp? Как и в случае, нажмите кнопку «Домой» и удалите все недавние приложения в Android. - person David Christie; 01.07.2019

Я думаю, что фоновое отслеживание геолокации, которое вы пытаетесь реализовать, уже существует как плагин cordova, он называется cordova-plugin-mauron85-background-geolocation.

Этот плагин является одновременно службой геолокации переднего и заднего плана. Это намного эффективнее, чем плагин геолокации html5 или cordova-geolocation.

Есть много вариантов конфигурации, см. Страницу github, указанную выше.

person theDmi    schedule 28.07.2016

Обходной путь на 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
            });
        }
    })
}
person Jose G Varanam    schedule 12.01.2018
comment
Работает ли это, если ваше приложение закрыто и НЕ работает в фоновом режиме ?! - person Rebar; 31.03.2018
comment
@Rebar Фоновая активность будет происходить только тогда, когда приложение находится в фоновом режиме. Приведенный выше код не будет поддерживать убитое приложение или НЕ работает в фоновом режиме. - person Jose G Varanam; 02.04.2018