You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:02:52