Як я можу запускати фонові завдання в React Native?


82

Я створив невеликий додаток для iOS у React Native, який здійснює відстеження місцезнаходження, регулярно надсилаючи lat / lng на сервер за вибором користувача. Однак це працює лише тоді, коли програма стоїть на передньому плані. Як запустити це завдання у фоновому режимі, коли користувач перебуває в інших програмах?


Можливо, ви можете зробити це, встановивши UIBackgroundModes для розташування в списку - подивіться тут developer.apple.com/library/ios/documentation/UserExperience/…
Бен Клейтон

4
У React Native є обмеження: коли програма перебуває у фоновому режимі, js-міст перестає отримувати повідомлення. Це означає, що якщо ви намагаєтеся надіслати дані з js, ви не зможете розраховувати на те, що дані їх роблять. Крім того, ви можете написати код для надсилання оновлень у
власному

3
Thansk @ rmevans9 це хороший початок. Для тих, хто знаходить це, я вже трохи попрацював тут gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee

1
@liamzebedee Не могли б ви прийняти відповідь?
Даніель Шмідт

@liamzebedee Як ти думаєш, чи можна було б реалізувати ці самі функції в Swift?
Габріель Гарретт

Відповіді:


62

В даний час, на жаль, немає підтримки будь-яких фонових завдань. Функцією, на яку ви посилаєтесь, буде фоновий таймер. Таким таймером є проблема цього продукту (запит на функцію) для рідної реакції, ви можете підтримати його, щоб показати підвищений попит на цю функцію.

EDIT 12/2016: Досі немає реального варіанту. У вас є Headless JS API з RN 0,33, але він призначений лише для Android. Також ваш додаток зазнає аварії, якщо це працює на передньому плані, тому вам слід бути обережним щодо його використання. Дякую @Feng за те, що це вказав.


2
фонове завдання тепер підтримується у версії 0.36, але лише для Android
Фен

1
@Feng У вас є посилання на документи для функції? Здається, я не міг знайти нічого у функції фонового завдання, вбудованій для реагування на рідне.
Venryx


26

І тепер є реакція-рідне-фонове завдання, яке є єдиним API як для Android, так і для iOS.


2
Плюс один для реакції-рідного-фонового завдання! Він дуже добре інтегрується з моїм пакетом реакції-рідної черги ( github.com/billmalarky/react-native-queue ). Якщо ви прокрутите вниз до «Повного прикладу фонових завдань ОС», ви побачите, як черга обробляє управління робочими місцями для вас, тому обмеження 30 секунд для фонових завдань iOS та Android не є складним завданням.
billmalarky

1
Я використав цю бібліотеку у своєму додатку, але вона не виконувала завдання, яке я встановив для регулярного запуску. Це нормально ??
simaAttar

2
Здається, проект React-native-background-task покинутий. З 2017 року жодного коміту немає, а запитів на видачу / витягування накопичується. Отже, сьогодні це, мабуть, не шлях.
eega

12

Протягом останніх кількох місяців екосистема React Native рухалася шаленими темпами, і з’явилося кілька плагінів, щоб усунути біль від неможливості запускати код у фоновому режимі.

https://github.com/transistorsoft/react-native-background-fetch - періодично прокидайтеся протягом 30 секунд, щоб запустити якийсь довільний код JS. Не підходить для геолокації з високою роздільною здатністю, оскільки час між пробудженнями становитиме 15 хв і більше.

https://github.com/transistorsoft/react-native-background-geolocation - кращий варіант для цієї ситуації, орієнтований конкретно на геолокацію у фоновому режимі.


4
Я використовую цей github.com/mauron85/react-native-background-geolocation, який здається досить схожим, але також безкоштовним для Android.
simlmx

@simlmx Я використовував response-native-background-geolocation, але він не виходить зі стаціонарного регіону з фону або з закритого додатка. Будь ласка, перевірте мої конфігурації тут stackoverflow.com/questions/61889407/ ... Буду вдячний за допомогу, заздалегідь дякую
кава

8

Ці бібліотеки можуть допомогти вам досягти бажаної функціональності:

  1. реакція-рідна-фонова-робота
  2. реакція-рідне-фонове завдання
  3. реагувати-рідний-фон-вибір

В якості альтернативи ви можете використовувати Headless JS від реагувати-native. Але це доступно лише для Android.


Я використав бібліотеку response-native-background-fetch у своєму додатку, але вона виконує потрібні завдання лише кілька разів на день. Це нормально ??
simaAttar

8

Я використовую це, і, здається, це працює: https://github.com/ocetnik/react-native-background-timer

Випускати подію періодично (навіть коли програма знаходиться у фоновому режимі).

Ви можете використовувати функції setInterval та setTimeout. Цей API ідентичний API рідного реагування і може бути використаний для швидкої заміни існуючих таймерів на фонові таймери.

import BackgroundTimer from 'react-native-background-timer';

// Start a timer that runs continuous after X milliseconds
const intervalId = BackgroundTimer.setInterval(() => {
    // this will be executed every 200 ms
    // even when app is the background
    console.log('tic');
}, 200);

// Cancel the timer when you are done with it
BackgroundTimer.clearInterval(intervalId);

// Start a timer that runs once after X milliseconds
const timeoutId = BackgroundTimer.setTimeout(() => {
    // this will be executed once after 10 seconds
    // even when app is the background
    console.log('tac');
}, 10000);

// Cancel the timeout if necessary
BackgroundTimer.clearTimeout(timeoutId);

Дякую! Але цей модуль не працює, якщо я вбиваю додаток із процесу, чи ви зараз подібні модулі, які працюють навіть я, вбиваю додаток?
Холявко

@ Холявко Вибачте, ні. Я знаю, що ви можете досягти цього за допомогою служби сигналізації, але не знаєте модуля, який допоможе вам це зробити.
Venryx

@ Холявко щастя?
chapeljuice

1
@chapeljuice, так, див. цей модуль github.com/vikeri/react-native-background-job
Холявко

Привіт! Здається, цей плагін призначений лише для Android. Чи знаєте ви якесь рішення для iOS?
Саймон Еліассон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.