Jak mogę uruchamiać zadania w tle w React Native?

82

Zbudowałem małą aplikację na iOS w React Native, która śledzi lokalizację, regularnie wysyłając lat / lng na serwer wybrany przez użytkownika. Jednak działa to tylko wtedy, gdy aplikacja jest na pierwszym planie. Jak mogę uruchomić to zadanie w tle, gdy użytkownik jest w innych aplikacjach?

liamzebedee
źródło
Prawdopodobnie możesz to zrobić, ustawiając UIBackgroundModes na lokalizację w plist - zajrzyj tutaj developer.apple.com/library/ios/documentation/UserExperience/ ...
Ben Clayton
4
W React Native istnieje ograniczenie polegające na tym, że gdy aplikacja działa w tle, most js przestaje otrzymywać wiadomości. Oznacza to, że jeśli próbujesz wysłać dane z js, nie będziesz mógł liczyć na dane, które je tworzą. Alternatywnie możesz napisać kod wysyłający aktualizacje w kodzie natywnym i to powinno załatwić
sprawę
3
Thansk @ rmevans9 to dobry początek. Dla każdego, kto to znajdzie, wykonałem już trochę pracy tutaj gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee
1
@liamzebedee Czy mógłbyś zaakceptować odpowiedź?
Daniel Schmidt,
@liamzebedee Czy uważasz, że byłoby możliwe zaimplementowanie tych samych funkcji w języku Swift?
Gabriel Garrett

Odpowiedzi:

62

Obecnie niestety nie ma żadnego wsparcia dla jakichkolwiek zadań w tle. Funkcja, do której się odnosisz, to licznik czasu w tle. Taki licznik czasu to ból produktu (prośba o funkcję) dla reagowania natywnego, możesz go zagłosować, aby pokazać zwiększone zapotrzebowanie na tę funkcję.

EDYCJA 12/2016: Nadal nie ma prawdziwej opcji. Masz Headless JS API od RN 0.33, ale jest to tylko dla Androida. Również Twoja aplikacja ulegnie awarii, jeśli działa to na pierwszym planie, więc musisz być ostrożny z jej użyciem. Dzięki @Feng za wskazanie tego.

Daniel Schmidt
źródło
2
Zadanie w tle jest teraz obsługiwane w wersji 0.36, ale tylko Android
Feng
1
@Feng Czy masz link do dokumentów dotyczących tej funkcji? Nie mogłem znaleźć niczego w funkcji zadań w tle wbudowanej w reagowanie.
Venryx
26

A teraz istnieje reakcja-natywne-zadanie w tle, które jest pojedynczym interfejsem API zarówno dla Androida, jak i iOS.

Matthew Wilcoxson
źródło
2
Plus jeden za zadanie reagowania-natywne-w tle! Bardzo dobrze integruje się z moim pakietem kolejki reagowania natywnego ( github.com/billmalarky/react-native-queue ). Jeśli przewiniesz w dół do „Przykład pełnego zadania w tle systemu operacyjnego”, możesz zobaczyć, jak kolejka obsługuje zarządzanie zadaniami za Ciebie, więc 30-sekundowy limit zadań w tle w systemie iOS i Android nie jest trudny.
billmalarky,
1
Korzystałem z tej biblioteki w mojej aplikacji, ale nie uruchomiła ona zadania, które ustawiłem jako uruchamiane regularnie. Jest to normalne??
simaAttar
2
Wydaje się, że projekt reagowania na natywne-zadanie w tle został porzucony. Brak zobowiązań od 2017 r., A problemy / żądania ściągnięcia piętrzą się. Więc prawdopodobnie nie jest to droga w dzisiejszych czasach.
eega
12

Ekosystem React Native poruszał się w zawrotnym tempie w ciągu ostatnich kilku miesięcy, a kilka wtyczek pojawiło się, aby rozwiązać problem braku możliwości uruchomienia kodu w tle.

https://github.com/transistorsoft/react-native-background-fetch - Obudź się okresowo na 30 sekund, aby uruchomić dowolny kod JS. Nie nadaje się do geolokalizacji o wysokiej rozdzielczości, ponieważ czas między wybudzeniami będzie wynosić 15 minut lub więcej.

https://github.com/transistorsoft/react-native-background-geolocation - lepsze dopasowanie do tej sytuacji, ukierunkowane szczególnie na geolokalizację w tle.

frontendloader
źródło
4
Używam tego github.com/mauron85/react-native-background-geolocation, który wydaje się dość podobny, ale także darmowy dla Androida.
simlmx
@simlmx Użyłem reaktywnej-natywnej-geolokalizacji tła, ale nie opuszczam stacjonarnego regionu z tła lub zamknięcia aplikacji, sprawdź tutaj moje konfiguracje stackoverflow.com/questions/61889407/ ... Byłbym wdzięczny za każdą pomoc, z góry dziękuję
kawa
8

Te biblioteki mogą pomóc w osiągnięciu pożądanej funkcjonalności:

  1. reakcja-native-background-job
  2. reaguj-natywne-zadanie-w tle
  3. reaguj-natywne-pobieranie-w tle

Alternatywnie, możesz użyć Headless JS z pliku React -Native. Ale jest dostępny tylko dla Androida.

Provash Shoumma
źródło
Korzystałem z biblioteki do pobierania danych w tle w mojej aplikacji, ale ona uruchamia poszukiwane zadania tylko kilka razy dziennie. Jest to normalne??
simaAttar
8

Używam tego i wydaje się, że działa: https://github.com/ocetnik/react-native-background-timer

Emituj zdarzenie okresowo (nawet gdy aplikacja działa w tle).

Możesz użyć funkcji setInterval i setTimeout. Ten interfejs API jest identyczny z interfejsem React-Native i może być używany do szybkiego zastępowania istniejących zegarów zegarami w tle.

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
źródło
Dzięki! Ale ten moduł nie działa, jeśli zabiję aplikację z procesu, czy masz teraz podobne moduły, które działają, nawet jeśli zabiję aplikację?
Kholiavko
@Kholiavko Przepraszamy, nie. Wiem, że możesz to osiągnąć, korzystając z usługi alarmowej, ale nie znam modułu, który ci to pomoże.
Venryx
@Kholiavko masz szczęście?
chapeljuice
1
@chapeljuice, tak, zobacz ten moduł github.com/vikeri/react-native-background-job
Kholiavko
Witaj! Wygląda na to, że ta wtyczka dotyczy tylko Androida. Czy znasz jakieś rozwiązanie na iOS?
Simon Eliasson