Wie kann ich Hintergrundaufgaben in React Native ausführen?


81

Ich habe in React Native eine kleine iOS-App erstellt , die die Standortverfolgung durchführt und die Lat / Lng regelmäßig an einen Server des Benutzers sendet. Dies funktioniert jedoch nur, wenn die App im Vordergrund steht. Wie kann ich diese Aufgabe im Hintergrund ausführen, wenn sich der Benutzer in anderen Apps befindet?


Sie können dies wahrscheinlich tun, indem Sie UIBackgroundModes auf den Speicherort in der Liste setzen - schauen Sie hier unter developer.apple.com/library/ios/documentation/UserExperience/…
Ben Clayton,

4
In React Native gibt es eine Einschränkung: Wenn sich die App im Hintergrund befindet, erhält die js-Brücke keine Nachrichten mehr. Dies bedeutet, wenn Sie versuchen, die Daten von js zu senden, können Sie nicht auf die Daten zählen, die sie erstellen. Alternativ können Sie den Code schreiben, um die Updates in nativem Code zu senden, und das sollte den Trick machen
rmevans9

3
Thansk @ rmevans9 das ist ein guter Anfang. Für alle, die dies finden, habe ich hier bereits ein wenig Arbeit geleistet gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee

1
@ Liamzebedee Würde es Ihnen etwas ausmachen, die Antwort zu akzeptieren?
Daniel Schmidt

@liamzebedee Glaubst du, es wäre möglich, dieselben Funktionen in Swift zu implementieren?
Gabriel Garrett

Antworten:


62

Derzeit gibt es leider keine Unterstützung für Hintergrundaufgaben jeglicher Art. Die Funktion, auf die Sie sich beziehen, ist ein Hintergrund-Timer. Solch ein Timer ist dieser Produktschmerz (eine Funktionsanforderung), um native zu reagieren. Sie können ihn verbessern, um eine erhöhte Nachfrage nach dieser Funktion anzuzeigen.

EDIT 12/2016: Es gibt noch keine echte Option. Sie haben die Headless JS API seit RN 0.33, aber es ist nur für Android. Außerdem stürzt Ihre App ab, wenn diese im Vordergrund ausgeführt wird. Sie müssen also vorsichtig sein, wenn Sie sie verwenden. Vielen Dank an @Feng für den Hinweis.


2
Hintergrundaufgabe wird jetzt in Version 0.36 unterstützt, aber nur Android
Feng

1
@Feng Haben Sie einen Link zu den Dokumenten für die Funktion? Ich konnte anscheinend nichts in einer Hintergrund-Task-Funktion finden, die in React-Native integriert ist.
Venryx


26

Und jetzt gibt es eine reaktive native Hintergrundaufgabe, die eine einzige API für Android und iOS ist.


2
Plus eins für React-Native-Background-Task! Es lässt sich sehr gut in mein React-Native-Queue-Paket ( github.com/billmalarky/react-native-queue ) integrieren. Wenn Sie zum "Beispiel für die vollständige Hintergrundaufgabe des Betriebssystems" scrollen, können Sie sehen, wie die Warteschlange die Verwaltung der Jobs für Sie übernimmt, sodass die 30-Sekunden-Begrenzung für iOS- und Android-Hintergrundaufgaben kein Problem darstellt.
Billmalarky

1
Ich habe diese Bibliothek in meiner App verwendet, aber sie hat nicht die Aufgabe ausgeführt, die ich für die regelmäßige Ausführung festgelegt habe. Es ist normal??
SimaAttar

1
Das Projekt "React-Native-Background-Task" scheint abgebrochen zu sein. Kein Commit seit 2017 und Probleme / Pull-Anfragen häufen sich. Das ist heutzutage wahrscheinlich nicht der richtige Weg.
Mega

12

Das React Native-Ökosystem hat sich in den letzten Monaten rasant entwickelt, und einige Plugins sind aufgetaucht, um den Schmerz zu beheben, dass Code nicht im Hintergrund ausgeführt werden kann.

https://github.com/transistorsoft/react-native-background-fetch - Wachen Sie regelmäßig 30 Sekunden lang auf, um beliebigen JS-Code auszuführen. Nicht für hochauflösende Geolokalisierung geeignet, da die Zeit zwischen dem Aufwecken 15 Minuten oder mehr beträgt.

https://github.com/transistorsoft/react-native-background-geolocation - Passt besser zu dieser Situation und ist speziell auf die Geolokalisierung im Hintergrund ausgerichtet.


4
Ich benutze diese eine github.com/mauron85/react-native-background-geolocation , die ziemlich ähnlich scheint, aber auch kostenlos für Android.
simlmx

@simlmx Ich habe React-Native-Background-Geolocation verwendet, aber die stationäre Region wird nicht aus dem Hintergrund oder der App geschlossen. Bitte überprüfen Sie meine Konfigurationen hier. stackoverflow.com/questions/61889407/… Ich würde mich über jede Hilfe freuen , danke im Voraus
Kaffee

@coffee, dieses Repo funktioniert nur im Vordergrundmodus
Felansu


8

Ich benutze dies und es scheint zu funktionieren: https://github.com/ocetnik/react-native-background-timer

Ereignis regelmäßig ausgeben (auch wenn sich die App im Hintergrund befindet).

Sie können die Funktionen setInterval und setTimeout verwenden. Diese API ist identisch mit der von React-Native und kann verwendet werden, um vorhandene Timer schnell durch Hintergrund-Timer zu ersetzen.

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

Vielen Dank! Aber dieses Modul funktioniert nicht, wenn ich App aus dem Prozess töte, haben Sie jetzt ähnliche Module, die funktionieren, auch wenn ich App töten werde?
Kholiavko

@Kholiavko Entschuldigung, nein. Ich weiß, dass Sie dies mithilfe des Alarmdienstes erreichen können, kenne jedoch kein Modul, das Ihnen dabei hilft.
Venryx

@Kholiavko Glück?
Kapellensaft

1
@chapeljuice, ja, siehe dieses Modul github.com/vikeri/react-native-background-job
Kholiavko

Hallo! Dieses Plugin scheint nur Android zu sein. Kennen Sie eine Lösung für iOS?
Simon Eliasson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.