React Native应用切入后台后请求失败,已试后台权限与Axios仍无效
解决 React Native 后台网络请求被取消的问题
问题根源
你启用的「Background processing」权限仅适用于周期性后台任务,无法保证正在进行的网络请求在应用切入后台后继续执行。iOS 和 Android 系统默认会挂起后台应用的常规网络会话,导致 fetch/Axios 请求被终止。
可行解决方案
1. 用第三方库封装后台任务
推荐使用 react-native-background-actions,它能将网络请求包装在后台任务中,避免被系统终止:
安装与配置
npm install react-native-background-actions
- iOS:在 Xcode 中开启「Background processing」和「Audio, AirPlay, and Picture in Picture」模式,在
Info.plist中添加后台任务描述:<key>UIBackgroundModes</key> <array> <string>processing</string> <string>audio</string> </array> - Android:在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
改造 API 调用代码
import BackgroundService from 'react-native-background-actions'; // 后台任务逻辑 const backgroundAPICall = async ({ endpoint, body, accessToken }) => { const backendURL = "https://example.com/api"; try { const response = await axios.post(`${backendURL}/${endpoint}`, body, { headers: { 'Content-Type': 'application/json', "Authorization": `Bearer ${accessToken}` } }); return JSON.parse(response.data); } catch (error) { console.error("后台请求失败:", error); return null; } finally { await BackgroundService.stop(); } }; export const performAPICall = async (endpoint, body) => { const accessToken = store.getState().nav.accessToken; const taskOptions = { taskName: '后台API请求', taskTitle: '处理中', taskDesc: '请稍候', taskIcon: { name: 'ic_launcher', type: 'mipmap' }, color: '#2196F3', parameters: { endpoint, body, accessToken } }; await BackgroundService.start(backgroundAPICall, taskOptions); return await BackgroundService.getTaskResult(); };
2. iOS 原生后台 URL 会话(无第三方库)
如果不想依赖库,可以原生实现后台 URL 会话:
- 在 iOS 代码中创建带后台配置的
URLSession:let config = URLSessionConfiguration.background(withIdentifier: "com.your.app.bgSession") let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) - 实现
URLSessionDelegate处理请求完成回调,并通过桥接通知 React Native。
3. Android 前台服务适配
Android 12+ 要求长时间后台任务必须运行在前台服务中,react-native-background-actions 已自动处理这一点,无需额外编码,只需确保权限配置正确。
关键注意事项
- 后台任务不能无限制运行,iOS 允许的后台任务时长约为 30 秒,Android 前台服务可运行更久但需显示通知。
- 避免在后台任务中执行大量计算,仅保留必要的网络请求逻辑。
内容的提问来源于stack exchange,提问作者Adam B
相关产品推荐
相关产品推荐

