Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to schedule background job at specific time in react native

Tags:

I want to execute some Task T at specific time in a day in background in react native. I see that it is possible in android as of now using Headless JS. I found that this library implemented this https://github.com/vikeri/react-native-background-job and allows you to execute stuff in background.

This is not completely what I am looking, it doesn't allows you to schedule a task T at specific time. Does anyone know any work around for this ?

I have checked this thread Execute code at specific time in react native where I didn't find a solution of my issue.

like image 404
N Sharma Avatar asked Aug 22 '17 19:08

N Sharma


People also ask

How do I run background service continuously in React Native?

Currently, there is, unfortunately, no support for background tasks of any kind. The feature you are referring to would be a background timer. Such a timer is this product pain (a feature request) for react native, you may upvote it to show an increased demand for this feature.

How do I turn off background timer in React Native?

runBackgroundTimer(() => { console. log('tic'); }, 1000); the timer is stopping when the app is in the background.

How do you handle background tasks in React Native?

In React Native, performing a task in the background might seem daunting at first. It is not as simple as writing a function in JavaScript, where the function is executed even after the activity is killed. Instead, React Native uses Headless JS to execute JavaScript code in the background.


1 Answers

I came across a similar issue, unfortunately, you can't specify something similar to CRON action in RN.

My solution to that problem is to use this library https://github.com/ocetnik/react-native-background-timer and calculate the difference between current time and time that the task is scheduled for.

The calculated time should be in ms, so you can use it with provided function setTimeout:

// 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 the background   console.log('tac'); }, 10000); 

Example:

Let's say you want to schedule task for tomorrow at 16th, in componentDidMount you can calculate time between now and scheduled date. Let's use moment for that:

componentDidMount(){   const scheduledDate =     moment().add(1,'d').set({hour:16,minute:0,second:0,millisecond:0})   const diffTime = scheduledDate.diff(moment())   this.timeoutId = BackgroundTimer.setTimeout(() => {     console.log('tac');   }, diffTime); }  componentWillUnmount(){  BackgroundTimer.clearTimeout(this.timeoutId); } 

Note that this solution is vulnerable to a user changing the time on his phone. The perfect solution would be to use some external service to fetch time.

Second note, the app needs to be at least in the background for this to work.

like image 135
jmac Avatar answered Sep 26 '22 22:09

jmac