如何在 React Native 中运行后台任务?
Posted
技术标签:
【中文标题】如何在 React Native 中运行后台任务?【英文标题】:How can I run background tasks in React Native? 【发布时间】:2016-05-24 10:25:27 【问题描述】:我在 React Native 中构建了一个 little ios app 来进行位置跟踪,定期将 lat/lng 发送到用户选择的服务器。但是,这仅在应用程序处于前台时才有效。当用户在其他应用中时,如何在后台运行此任务?
【问题讨论】:
您可以通过将 UIBackgroundModes 设置为 plist 中的位置来做到这一点 - 看看这里 developer.apple.com/library/ios/documentation/UserExperience/… React Native 有一个限制,当应用程序在后台时,js 桥停止接收消息。这意味着如果您尝试从 js 发送数据,那么您将无法指望生成它的数据。或者,您可以编写代码以在本机代码中发送更新,这应该可以解决问题 谢谢@rmevans9 这是一个好的开始。对于发现这个的人,我已经在这里做了一些工作gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec @liamzebedee 你介意接受这个答案吗? @liamzebedee 你认为有可能在 Swift 中实现这些相同的功能吗? 【参考方案1】:不幸的是,目前不支持任何类型的后台任务。您所指的功能是后台计时器。这样的计时器是 this product pain (a feature request) 用于反应原生,你可以投票它以表明对该功能的需求增加。
编辑 12/2016: 仍然没有真正的选择。从 RN 0.33 开始,您就有了 Headless JS API,但它仅适用于 android。如果它在前台运行,您的应用程序也会崩溃,因此您必须小心使用它。感谢@Feng 指出这一点。
【讨论】:
0.36版本现在支持后台任务,但仅限android @Feng 你有该功能的文档链接吗?我似乎在 react-native 内置的后台任务功能上找不到任何东西。 @Venryx facebook.github.io/react-native/blog/2016/10/25/…【参考方案2】:现在有了react-native-background-task,它是适用于 Android 和 iOS 的单一 API。
【讨论】:
加一个用于 react-native-background-task!它与我的 react-native-queue 包 (github.com/billmalarky/react-native-queue) 集成得非常好。如果您向下滚动到“OS 后台任务完整示例”,您可以看到队列如何为您处理作业管理,因此 iOS 和 Android 后台任务的 30 秒限制并不难处理。 我在我的应用程序中使用了这个库,但它没有运行我设置为定期运行的任务。正常吗?? react-native-background-task 项目似乎已被放弃。自 2017 年以来没有提交,并且问题/拉取请求正在堆积。所以这可能不是现在要走的路。【参考方案3】:我用这个,它似乎工作:https://github.com/ocetnik/react-native-background-timer
定期发出事件(即使应用在后台)。
您可以使用 setInterval 和 setTimeout 函数。此 API 与 react-native 相同,可用于快速将现有定时器替换为后台定时器。
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);
【讨论】:
谢谢!但是如果我从进程中杀死应用程序,这个模块就不起作用,你现在有没有类似的模块,即使我会杀死应用程序也能工作? @Kholiavko 对不起,不。我知道您可以通过使用警报服务来实现这一点,但不知道有什么模块可以帮助您做到这一点。 @Kholiavko 运气好吗? @chapeljuice,是的,看这个模块github.com/vikeri/react-native-background-job 您好!这个插件似乎只有安卓。你知道 iOS 的任何解决方案吗?【参考方案4】:在过去的几个月里,React Native 生态系统一直在以惊人的速度发展,并且出现了一些插件来解决无法在后台运行代码的痛苦。
https://github.com/transistorsoft/react-native-background-fetch -- 定期唤醒 30 秒以运行一些任意 JS 代码。不适合高分辨率地理定位,因为两次唤醒之间的时间为 15 分钟或更长时间。
https://github.com/transistorsoft/react-native-background-geolocation -- 更适合这种情况,专门针对后台地理定位。
【讨论】:
我正在使用这个github.com/mauron85/react-native-background-geolocation,它看起来非常相似,但对 Android 也是免费的。 @simlmx 我使用了 react-native-background-geolocation 但它不会从后台或应用程序关闭退出固定区域,请在此处检查我的配置***.com/questions/61889407/… 我将不胜感激,谢谢前进【参考方案5】:这些库可以帮助您实现所需的功能:
-
react-native-background-job
react-native-background-task
react-native-background-fetch
或者,您可以使用 react-native 中的 Headless JS。但它仅适用于 Android。
【讨论】:
我在我的应用程序中使用了 react-native-background-fetch 库,但它每天只运行几次所需的任务。正常吗??【参考方案6】:在android中使用无尽的任务管理系统您可以在后台剧院运行任务,应用程序在后台或应用程序处于终止模式。
您可以使用本机桥接器来执行此操作,也可以使用包 Example Explaned here:
React-native 包做同样的 WithOut 桥接react-native-endless-background-service-without-notification
【讨论】:
【参考方案7】:我们解决了这个问题,我在 Android 和 iOS 中编写了我们自己的模块并使用事件通知前端
【讨论】:
请阅读如何write a good answer。以上是关于如何在 React Native 中运行后台任务?的主要内容,如果未能解决你的问题,请参考以下文章
除了 react-native-background-task 之外,还有其他方法可以在 React Native 中执行后台任务吗?
在android中安排后台任务并从任务中调用react-native javascript方法