如何在React Native中运行后台任务?


81

我在React Native中构建了一个小的iOS应用程序,该应用程序进行位置跟踪,并定期将经纬度发送到用户选择的服务器。但是,这仅在应用程序处于前台时有效。当用户使用其他应用程序时,如何在后台运行此任务?


您可以通过将UIBackgroundModes设置到plist中的位置来实现此目的-在此处查看developer.apple.com/library/ios/documentation/UserExperience/…–
Ben Clayton,

4
React Native中有一个限制,其中当应用程序在后台运行时,js桥会停止获取消息。这意味着,如果您尝试从js发送数据,则将无法依靠创建它的数据。另外,您也可以编写代码以本机代码发送更新,这应该可以解决问题
rmevans9 '16

3
Thansk @ rmevans9这是一个好的开始。对于任何发现此问题的人,我已经在这里做了一些工作gist.github.com/liamzebedee/67e1b2c53c6c5edcf8ec
liamzebedee

1
@liamzebedee您介意接受答案吗?
Daniel Schmidt

@liamzebedee您认为可以在Swift中实现这些相同的功能吗?
加百利·加勒特

Answers:


61

不幸的是,当前不支持任何类型的后台任务。您所指的功能将是后台计时器。这样的计时器是产品对本机响应的痛苦(功能请求),您可以投票赞成它,以显示对该功能的需求增加。

编辑12/2016:仍然没有真正的选择。自RN 0.33起,您就拥有Headless JS API,但这仅适用于android。另外,如果此应用程序在前台运行,则该应用程序将崩溃,因此您必须谨慎使用它。感谢@Feng指出这一点。


2
版本0.36现在支持后台任务,但仅适用于android
Feng

1
@Feng您是否具有该功能文档的链接?我似乎在内置于react-native的后台任务功能上找不到任何东西。
Venryx


26

现在有react-native-background-task,它是适用于Android和iOS的单个API。


2
再加上一个用于本机背景任务!它与我的react-native-queue软件包(github.com/billmalarky/react-native-queue)集成得很好。如果向下滚动到“ OS后台任务完整示例”,您将看到队列如何为您处理作业管理,因此iOS和Android后台任务的30秒限制不难处理。
billmalarky

1
我已经在我的应用程序中使用了这个库,但是它没有运行我设置为定期运行的任务。正常吗?
simaAttar

1
react-native-background-task项目似乎已被放弃。自2017年以来没有提交,问题/拉动请求正在堆积。因此,这可能不是当今的方式。
eega

12

在过去的几个月中,React Native生态系统一直以惊人的速度发展,并且出现了一些插件,以解决无法在后台运行代码的痛苦。

https://github.com/transistorsoft/react-native-background-fetch-定期唤醒30秒以运行一些任意JS代码。不适合高分辨率地理位置,因为唤醒之间的时间将为15分钟或更长时间。

https://github.com/transistorsoft/react-native-background-geolocation-更适合这种情况,专门针对后台地理位置。


4
我正在使用这个github.com/mauron85/react-native-background-geolocation,看起来很相似,但也可以免费用于Android。
simlmx

@simlmx我使用了react-native-background-geolocation,但是它没有从背景或应用程序关闭退出静止区域,请在此处检查我的配置 stackoverflow.com/questions/61889407/… 感谢您的帮助,在此先感谢
咖啡

@coffee,该存储库仅在前台模式下有效
felansu


7

我使用它,它似乎可以工作:https : //github.com/ocetnik/react-native-background-timer

定期发送事件(即使应用在后台运行)。

您可以使用setInterval和setTimeout函数。此API与react-native的API相同,可用于用后台计时器快速替换现有计时器。

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对不起,没有。我知道您可以通过使用警报服务来完成此任务,但不知道有什么模块可以帮助您完成此任务。
Venryx

@Kholiavko有运气吗?
chapeljuice

1
@chapeljuice,是的,请参见此模块github.com/vikeri/react-native-background-job
Kholiavko

你好!该插件似乎仅适用于Android。您知道iOS的任何解决方案吗?
西蒙·埃里亚森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.