如何在本机反应中正确使用 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,所以实现不同。
我正在使用 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,所以实现不同。