如何在 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 中执行后台任务吗?

应用关闭时 React Native 运行任务

在android中安排后台任务并从任务中调用react-native javascript方法

当应用程序使用 react-native-background-task 在后台运行时如何调用函数?

没有 react-native 是不是可以在 Android 和/或 iOS 的后台任务中收集地理位置信息?