Il existe différentes façons d'exécuter des tâches en arrière-plan dans Android et iOS respectivement. J'ai trouvé Quelle est la meilleure façon de planifier une tâche dans Android? ainsi sur la pile débordement.
Je me demande quelle est la meilleure façon d'utiliser react-native
seulement. Serait-il suffisant d'utiliser setInterval
ou setTimeout
pour des tâches qui doivent s'exécuter quotidiennement ou toutes les quelques heures?
Ces tâches ne seraient-elles pas tuées par le système d'exploitation?
Des idées ou suggestions?
Je répondrai à ma propre question pour voir si ces informations peuvent être utilisées par quiconque les recherche.
Étant donné que les différents systèmes d'exploitation mobiles ont tendance à supprimer les tâches d'arrière-plan ou à les bloquer pour économiser la batterie, il existe peu de méthodes déterministes pour planifier des tâches en mode natif. J'utilise une combinaison des éléments suivants:
Déchargez les minuteries en arrière-plan, qui fonctionnent avec l'application à la fois en avant et en arrière-plan https://github.com/ocetnik/react-native-background-timer (! Si vous utilisez create-react-native -app vous devez l'éjecter)
Utilisez une extraction en arrière-plan pour iOS et HeadlessTask dans Android, voici une bibliothèque décente https://github.com/jamesisaac/react-native-background-task
Utilisez les mises à jour de géolocalisation pour réveiller l'application et démarrer les threads https://github.com/mauron85/react-native-background-geolocation .
Je suppose que vous pouvez suivre des stratégies similaires en utilisant des réveils Bluetooth.
Notifications push à partir d'un serveur pour garantir de manière déterministe que l'application se réveille (sauf si elle a été tuée par le système d'exploitation). Dans iOS, assurez-vous d'appeler notification.finish()
pour éviter d'être discriminé par l'algorithme du gestionnaire de tâches.
Pour Android vous pouvez essayer d'utiliser l'API AlarmManager https://github.com/vikeri/react-native-background-job .
Méfiez-vous des dragons: votre application peut être fermée si elle abuse du temps d'exécution ou de l'utilisation de la mémoire après un réveil du système. Vous devrez peut-être réhydrater tous les auditeurs après avoir laissé le téléphone sans batterie. L'utilisateur doit donc encore interagir fortement avec votre application.
Mise à jour : De Android O il y a des limites d'exécution en arrière-plan très strictes. Lorsque vous utilisez un service HeadlessJSTask, assurez-vous qu'il est lancé en tant que service de premier plan si vous souhaitez qu'il dure plus de quelques secondes. Il peut nécessiter une notification avec lui. Tenez compte du fait que seul le chargement du bundle peut prendre jusqu'à quelques secondes, selon votre application et l'appareil.
En fait, il n'y a pas de moyen suffisant pour cela. mais nous pouvons remarquer mauron85 comme un moyen meilleur que d'autres sur Android mais aussi cela ne fonctionne pas parfaitement sur [ ~ # ~] ios [~ # ~] . Par exemple, si l'application a tué l'utilisateur, le travail ne fonctionnera pas ou il n'y a aucun contrôle sur la quantité d'exécution du travail que le travail se déclenche chaque fois que l'appareil change de position.
d'autres composants comme react-native-background-fetch et react-native-background-task ont la limitation de la période d'exécution du travail (le travail se répète après chaque 15 minutes et il n'y a aucun moyen de réduire cette période) et ils fonctionnent simplement sur Android.
ce serait formidable si Facebook react native avait une solution pratique à ce problème.