¿Cómo puedo ejecutar tareas en segundo plano en React Native?

81

Creé una pequeña aplicación de iOS en React Native que realiza un seguimiento de la ubicación, enviando la latitud / longitud con regularidad a un servidor de elección del usuario. Sin embargo, esto solo funciona cuando la aplicación está en primer plano. ¿Cómo puedo ejecutar esta tarea en segundo plano cuando el usuario está en otras aplicaciones?

liamzebedee
fuente
Probablemente pueda hacer esto configurando UIBackgroundModes en la ubicación en la lista; eche un vistazo aquí developer.apple.com/library/ios/documentation/UserExperience/…
Ben Clayton
4
Hay una limitación en React Native en la que cuando la aplicación está en segundo plano, el puente js deja de recibir mensajes. Esto significa que si está tratando de enviar los datos desde js, no podrá contar con los datos que lo harán. Alternativamente se podría escribir el código para enviar las actualizaciones en código nativo y que debe hacer el truco
rmevans9
3
Thansk @ rmevans9 este es un buen comienzo. Para cualquiera que encuentre esto, ya he hecho un poco de trabajo aquí gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee
1
@liamzebedee ¿Te importaría aceptar la respuesta?
Daniel Schmidt
@liamzebedee ¿Crees que sería posible implementar estas mismas funciones en Swift?
Gabriel Garrett

Respuestas:

61

Actualmente, desafortunadamente, no hay soporte para tareas en segundo plano de ningún tipo. La función a la que se refiere sería un temporizador de fondo. Tal temporizador es el problema de este producto (una solicitud de función) para reaccionar nativo, puede votarlo para mostrar una mayor demanda de esta función.

EDITAR 12/2016: Todavía no hay una opción real. Tiene la API de Headless JS desde RN 0.33, pero es solo para Android. Además, su aplicación se bloqueará si se ejecuta en primer plano, por lo que debe tener cuidado al usarla. Gracias a @Feng por señalar eso.

Daniel Schmidt
fuente
2
La tarea en segundo plano ahora es compatible con la versión 0.36, pero solo en Android
Feng
1
@Feng ¿Tiene un enlace a los documentos de la función? Parece que no pude encontrar nada en una función de tarea en segundo plano integrada en react-native.
Venryx
26

Y ahora está react-native-background-task, que es una única API tanto para Android como para iOS.

Matthew Wilcoxson
fuente
2
¡Más uno para react-native-background-task! Se integra muy bien con mi paquete react-native-queue ( github.com/billmalarky/react-native-queue ). Si se desplaza hacia abajo hasta el "Ejemplo completo de tarea en segundo plano del sistema operativo", puede ver cómo la cola maneja la administración de los trabajos por usted, por lo que el límite de 30 segundos en las tareas en segundo plano de iOS y Android no es un problema.
billmalarky
1
Hice uso de esta biblioteca en mi aplicación, pero no ejecutó la tarea que configuré para que se ejecutara regularmente. ¿¿Es normal??
simaAttar
1
El proyecto react-native-background-task parece abandonado. No hay confirmación desde 2017 y los problemas / solicitudes de extracción se están acumulando. Así que probablemente este no sea el camino a seguir hoy en día.
eega
12

El ecosistema React Native se ha movido a un ritmo vertiginoso durante los últimos meses, y han aparecido algunos complementos para abordar el dolor de no poder ejecutar código en segundo plano.

https://github.com/transistorsoft/react-native-background-fetch : despierta durante 30 segundos periódicamente para ejecutar código JS arbitrario. No apto para geolocalización de alta resolución, ya que el tiempo entre despertares será de 15 minutos o más.

https://github.com/transistorsoft/react-native-background-geolocation : un ajuste mejor para esta situación, dirigido específicamente a la geolocalización en segundo plano.

cargador frontend
fuente
4
Estoy usando este github.com/mauron85/react-native-background-geolocation que parece bastante similar pero también gratuito para Android.
simlmx
@simlmx He usado react-native-background-geolocation pero no sale de la región estacionaria desde el fondo o el cierre de la aplicación, por favor verifique mis configuraciones aquí stackoverflow.com/questions/61889407/ ... Agradecería cualquier ayuda, gracias de antemano
café
@coffee, ese repositorio funciona solo en modo de primer plano
felansu
7

Yo uso esto y parece que funciona: https://github.com/ocetnik/react-native-background-timer

Emite eventos periódicamente (incluso cuando la aplicación está en segundo plano).

Puede utilizar las funciones setInterval y setTimeout. Esta API es idéntica a la de react-native y se puede utilizar para reemplazar rápidamente los temporizadores existentes con temporizadores en segundo plano.

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
fuente
¡Gracias! Pero este módulo no funciona si elimino la aplicación del proceso, ¿ahora tienen módulos similares, que funcionan incluso yo mataré la aplicación?
Kholiavko
@Kholiavko Lo siento, no. Sé que puede lograrlo mediante el uso del servicio de alarma, pero no conozco ningún módulo que le ayude a hacerlo.
Venryx
@Kholiavko, ¿suerte?
chapeljuice
1
@chapeljuice, sí, vea este módulo github.com/vikeri/react-native-background-job
Kholiavko
¡Hola! Este complemento parece ser solo para Android. ¿Conoces alguna solución para iOS?
Simon Eliasson