【问题标题】:How can I run background tasks in React Native?如何在 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 中实现这些相同的功能吗?

标签: javascript ios react-native


【解决方案1】:

不幸的是,目前不支持任何类型的后台任务。您所指的功能是后台计时器。这样的计时器是 this product pain (a feature request) 用于反应原生,你可以投票它以表明对该功能的需求增加。

编辑 12/2016: 仍然没有真正的选择。从 RN 0.33 开始,您就有了 Headless JS API,但它仅适用于 android。如果它在前台运行,您的应用程序也会崩溃,因此您必须小心使用它。感谢@Feng 指出这一点。

【讨论】:

【解决方案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 -- 更适合这种情况,专门针对后台地理定位。

【讨论】:

【解决方案5】:

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

  1. react-native-background-job
  2. react-native-background-task
  3. 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 中编写了我们自己的模块并使用事件通知前端

    【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2020-12-20
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多