如何在本机反应中正确使用 redux saga 和后台事件?

How to properly work with redux saga and background event in react native?

我正在使用 react-native、redux-saga、react-native-background-task。

首先,当我的应用程序从前台转到后台(在 IOS 和 Android 上)时,saga 继续。我原以为它会停止,但我猜是因为 saga 在另一个线程上,所以它会继续。这是否会导致电池管理出现问题或阻止 IOS 允许应用程序执行后台获取事件?

其次,当后台任务启动时,在 Android 应用程序上我的主要 saga 正常启动(不是预期的行为,我本以为只有后台任务代码到 运行。在 IOS,如我所料,只有后台任务代码 运行s。为什么 Android 应用程序再次开始整个传奇?

第三,当我使用 xcode 到 'simulate background fetch' 时它工作了一点,但现在它正在关闭任何其他打开的应用程序而不是 运行ning 任务代码.这是为什么?

这里是我定义后台任务的地方:

BackgroundTask.define(async () => {
    const now = moment().format("HH:mm:ss");
    console.log("Executing background task at: ", now);
    console.log("Test Test Test!");
    BackgroundTask.finish();
});

这里是我安排后台任务并包含 redux 的地方:

import React from 'react';
import { SafeAreaView, View, StatusBar, Alert } from 'react-native';
import { Provider } from 'react-redux';
import { redux_store } from './redux/store';
import { AppContainer } from './helpers/navigation.js';
import { styles } from './styles/styles.js';
import ReduxRootConnection from './components/reduxRoot';
import { aws_configure } from './helpers/aws-configure';
import BackgroundTask from 'react-native-background-task'

aws_configure();

import { initPushNotifications } from './helpers/initPN';

export default class App extends React.Component {

    componentDidMount() {
        // TODO: add this back in
        // initPushNotifications()

        BackgroundTask.schedule();
        this.check_background_task_status();
    }

    async check_background_task_status() {
        const status = await BackgroundTask.statusAsync();
        console.log("BackgroundTask Status: ", status);
    }

    render() {
        return (
            <Provider store={redux_store}>
                <View style={{flex: 1}}>
                    <SafeAreaView style={styles.mainAppContainerStyle}>
                        <ReduxRootConnection>
                            <AppContainer/>
                        </ReduxRootConnection>
                    </SafeAreaView>
                </View>
            </Provider>
        );
    }
}

当 React 本机应用程序在 android 上运行时,这并不意味着 activity 一定会被破坏,因此您的 js 代码可能会继续 运行 一段不确定的时间.如果用户不再打开它,您的 activity 最终可能会停止,但您无法确切知道何时。您可以使用 React Native 的 AppState (https://facebook.github.io/react-native/docs/appstate) 来取消您希望在应用程序进入后台时取消的 sagas。

对于后台任务问题,android 上的 BackgroundTask 实现使用了 React Native 的无头 js (https://facebook.github.io/react-native/docs/headless-js-android.html),它在后台启动整个应用程序。在 ios 上没有无头 js,所以实现不同。