React Native 后台任务

发现由来:需要在应用处于background或者手机锁屏或both时也能记录轨迹

坑的深度:3天!!!

React-Native本身不支持,寻觅测试了如下第三方包:

react-native-background-job: 确实可以加后台执行,但最高执行频率为15分钟

react-native-background-task: 确实可以加后台执行,但最高执行频率为15分钟

发现使用的react-native-amap3d(高德Android API的RN封装版)有后台定位功能且能设置间隔时间,但测试发现,确实可以定时调用GPS模块,但无法将定位结果写入程序记录下来

发现有一个基于GOOGLE地图API写的RN包,react-native-background-geolocation被认定完美支持后台定位,但国内没法用

发现EXPO这个在RN之上封装的开发架构的最新版提供完美的后台定位功能(是作为亮点在Github、StackOverflow上被提起和讨论了很久),一度打算将代码迁移至此架构上重写,但因为需要重新学习且此架构只能在MAC下开发未下定决心迁移

最后某天夜里无意中搜到一篇对RN后台任务解决方案的综述文章,提到了一个很简单的后台定时器的包react-native-background-timer几乎完美的在两个系统中均能运行,经测试,确实可用。

应用举例:

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 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 the background
    console.log('tac');
}, 10000);
// Cancel the timeout if necessary
BackgroundTimer.clearTimeout(timeoutId);