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

Javascript 如何在React Native中运行后台任务?,javascript,ios,react-native,Javascript,Ios,React Native,我已经建立了一个内置的React Native,可以进行位置跟踪,定期将lat/lng发送到用户选择的服务器。但是,这仅在应用程序位于前台时有效。当用户在其他应用程序中时,如何在后台运行此任务?不幸的是,目前不支持任何类型的后台任务。您所指的功能将是后台计时器。这样的计时器是用于react native的,您可以将其向上投票以显示对该功能的需求增加 2016年12月编辑:仍然没有实物期权。您从RN 0.33开始就有了API,但它只适用于android。如果在前台运行,你的应用程序也会崩溃,所以你

我已经建立了一个内置的React Native,可以进行位置跟踪,定期将lat/lng发送到用户选择的服务器。但是,这仅在应用程序位于前台时有效。当用户在其他应用程序中时,如何在后台运行此任务?

不幸的是,目前不支持任何类型的后台任务。您所指的功能将是后台计时器。这样的计时器是用于react native的,您可以将其向上投票以显示对该功能的需求增加


2016年12月编辑:仍然没有实物期权。您从RN 0.33开始就有了API,但它只适用于android。如果在前台运行,你的应用程序也会崩溃,所以你必须小心使用它。感谢@Feng指出这一点。

在过去的几个月里,React原生生态系统以惊人的速度发展,一些插件已经出现,以解决无法在后台运行代码的痛苦

--定期醒来30秒,运行一些任意JS代码。不适用于高分辨率地理定位,因为唤醒之间的时间为15分钟或更长


--更适合这种情况,特别针对背景中的地理位置。

我使用这种方法,它似乎有效:

定期发出事件(即使应用程序处于后台)

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


现在有了一个适用于Android和iOS的单一API。

这些库可以帮助您实现所需的功能:



  • 或者,您可以使用from react native。但是它只适用于Android。

    你可以通过在plist中将UIBackgroundModes设置为location来实现这一点-看看这里,React Native中有一个限制,当应用程序位于后台时,js桥停止接收消息。这意味着,如果您试图从js发送数据,那么您将无法指望数据能够成功。或者,您也可以编写代码,以本机代码发送更新,这将完成trickThansk@rmevans9这是一个良好的开端。对于任何发现这个的人,我已经在这里做了一点工作@liamzebedee你介意接受答案吗?@liamzebedee你认为可以在Swift中实现这些相同的功能吗?我正在使用这个看起来非常相似但对Android来说也是免费的。@simlmx我使用了react native background geolocation,但它没有从后台退出静止区域或关闭应用程序,请在此处检查我的配置我将感谢任何帮助,感谢Advanced 0.36版现在支持后台任务,但androidonly@Feng您是否有该功能文档的链接?我似乎在内置的后台任务功能中找不到任何东西来响应本机任务。@Venryx谢谢!但如果我从进程中杀掉应用程序,这个模块就不起作用了,你现在有没有类似的模块,即使我会杀掉应用程序也能起作用?@Kholiavko抱歉,没有。我知道你可以通过使用报警服务来完成这一点,但不知道有哪个模块可以帮助你这么做。@Kholiavko运气好吗?@chapeljuice,是的,看到这个模块了吗!这个插件似乎只是Android的。你知道iOS有什么解决方案吗?还有一个用于react本机后台任务的解决方案!它与我的react原生队列包()集成得非常好。如果你向下滚动到“操作系统后台任务完整示例”,你可以看到队列如何为你处理作业管理,因此iOS和Android后台任务的30秒限制并不难处理。我在我的应用程序中使用了这个库,但它没有运行我设置为定期运行的任务。正常吗?react本机后台任务项目似乎已被放弃。自2017年以来没有提交,问题/请求正在堆积。所以现在可能不是这样。我在我的应用程序中使用了react native background fetch library,但它每天只运行几次想要的任务。这正常吗??
    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);