Je veux exécuter une tâche T à une heure précise de la journée en arrière-plan en natif. Je vois qu'il est possible sous Android à partir de maintenant d'utiliser Headless JS . J'ai trouvé que cette bibliothèque implémentait ce https://github.com/vikeri/react-native-background-job et vous permet d'exécuter des choses en arrière-plan.
Ce n’est pas tout à fait ce que je cherche, cela ne vous permet pas de planifier une tâche T à une heure précise. Est-ce que quelqu'un connaît des travaux pour cela?
J'ai vérifié ce fil Exécuter le code à une heure spécifique dans réagit natif où je n'ai pas trouvé de solution à mon problème.
Je suis tombé sur un problème similaire. Malheureusement, vous ne pouvez pas spécifier quelque chose de similaire à l'action CRON dans RN.
Ma solution à ce problème consiste à utiliser cette bibliothèque https://github.com/ocetnik/react-native-background-timer et à calculer la différence entre l'heure actuelle et l'heure de planification de la tâche.
Le temps calculé doit être en ms, vous pouvez donc l'utiliser avec la fonction fournie 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);
Exemple:
Supposons que vous souhaitiez planifier la tâche pour demain à 16, dans componentDidMount
, vous pouvez calculer le temps entre maintenant et la date prévue. Utilisons moment
pour cela:
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);
}
Notez que cette solution est vulnérable à un utilisateur qui change l'heure sur son téléphone. La solution idéale serait d'utiliser un service externe pour récupérer le temps.
Deuxième remarque, l'application doit être au moins à l'arrière-plan pour que cela fonctionne.
Le code JavaScript s'exécute en avant-plan avec un seul thread. Si vous avez besoin d'une tâche en arrière-plan planifiée, vous devez implémenter des modules natifs, comme décrit dans le document RN:
https://facebook.github.io/react-native/docs/native-modules-ios.html
https://facebook.github.io/react-native/docs/native-modules-Android.html
Bien entendu, toutes les restrictions de la plate-forme (notamment iOS) s'appliquent.
Créer une classe et l'ajouter à votre classe
public static final long NOTIFY_INTERVAL = 10 * 1000; // 30 minutes
@Override
public void onCreate() {
// cancel if already existed
if (mTimer != null) {
mTimer.cancel();
} else {
// recreate new
mTimer = new Timer();
}
// schedule task
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}
class TimeDisplayTimerTask extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
// code
}
});
}
}