SuperAPI AI 工具集

background-tasks

编程与开发

查看项目

更新于 10-18 18:01

技能介绍

用途

该技能旨在帮助开发者在 React Native(Expo)应用中正确实现后台任务。后台任务是指系统可能在后台短时间运行、可能被提前终止或重复执行、甚至可能永不执行的工作。该技能基于 expo-background-task 和 expo-task-manager,提供一套经过验证的规则、模板和检查工具,确保后台任务幂等、可恢复、预算受限,并能通过测试和设备验证。

主要能力

  • 任务定义规范:要求所有任务在模块顶层定义,确保无头启动时能找到;任务名称使用字面量且唯一,避免调用点漂移。
  • 预算控制:每个任务有不超过 25 秒的字面量预算,并在每个步骤前调用 shouldStop() 检查,以便在系统终止前干净退出。
  • 执行器统一封装:所有执行器通过 toTaskExecutor(job, createBackgroundEnvironment) 包装,将异常转为记录崩溃的运行,并映射到 BackgroundTaskResult,永不拒绝。
  • 幂等与可恢复:任务必须幂等且可恢复,每个外部效果使用幂等键,状态转换代替递增,每个步骤一次提交,进度存储在存储中。
  • 无 React 依赖:任务运行时不导入 React、React Native、路由、状态管理等模块,通过 BackgroundDeps 接收端口和仓库。
  • 数据库访问规则:后台运行不执行迁移,通过数据层的后台打开路径获取仓库,仅当版本最新时打开独立连接,否则返回 deferred。
  • 调度协调:通过 reconcileBackgroundTasks 在启动后注册一个至少 15 分钟的显式间隔,并处理可用性和用户设置。
  • 前台路径:同一任务也可通过 runBackgroundJob 在前台路径运行,使用 trigger: 'foreground',避免重叠。
  • 测试与设备验证:提供测试工具包(runJobTwice、runJobUntilAborted),以及 Android 模拟器和 iOS 真机的强制运行验证方法。
  • 检查器:零依赖检查脚本验证 tsc、ESLint 和 Jest 无法覆盖的部分。

使用方式

  1. 确认是否为后台任务:定时提醒应使用本地通知,服务器事件使用推送,打开时刷新使用前台路径。
  2. 阅读平台限制文档,了解 iOS 和 Android 的行为。
  3. 安装依赖:npx expo install expo-background-task expo-task-manager;在应用配置插件中添加 'expo-background-task';重新生成原生快照;移除 expo-background-fetch(如存在)。
  4. 复制模板文件到指定路径:templates/src/services/background-tasks/、templates/src/services/background-run-log/、templates/test/background/。
  5. 在入口文件 index.ts 中导入 define-background-tasks 模块,位置在 Intl polyfills 之后、'expo-router/entry' 之前。
  6. 参照示例编写任务:定义字面量名称和预算、有界批次、每步前 shouldStop()、使用 kebab-case 原因的结果。
  7. 使用测试工具包编写测试,模拟运行两次和中断运行。
  8. 在 BACKGROUND_JOBS 中注册任务,并在 createBackgroundEnvironment() 中添加依赖。
  9. 启动后调用 reconcileBackgroundTasks,并在设置变化时重新协调。
  10. 添加前台路径,在应用活跃或写入后运行同一任务。
  11. 运行类型检查、lint、Jest 测试,并执行检查脚本直至 RESULT: PASS。
  12. 在指定 Android 模拟器(adb -s)和 iOS 真机上强制运行,验证后台记录。

适用场景

  • 需要周期性同步数据的 React Native 应用。
  • 从 expo-background-fetch 迁移到 expo-background-task 的项目。
  • 使用 TaskManager.defineTask 但遇到任务未注册或重复执行问题的场景。
  • 需要确保后台任务在系统限制下仍能安全、幂等运行的开发团队。

限制

  • 后台任务间隔为最小值,系统不保证每 15 分钟运行;iOS 可能在夜间窗口运行。
  • 任务预算最多 25 秒,超时会被终止,需设计为有界批次和可恢复。
  • 后台运行不执行数据库迁移,需返回 deferred。
  • 测试触发器仅在调试构建中有效,生产构建无效。
  • iOS 模拟器不支持后台任务,需使用真机验证。
  • 部分 SDK 版本(57.0.21)中 addExpirationListener 可能不触发,需每步提交。
  • 文档未提供收费、价格等信息。