SuperAPI AI 工具集

background-processing

编程与开发

查看项目

更新于 10-16 09:11

技能介绍

用途

该技能用于在 iOS 上注册、调度与执行后台工作,基于 BackgroundTasks 框架、后台 URLSession 以及后台推送通知,帮助开发者在应用不处于前台(挂起或终止)时完成数据获取、维护处理、导出和下载等操作。

主要能力

  • BGAppRefreshTask:短时任务(约 30 秒),用于获取小型数据更新;系统根据使用模式决定启动时机。
  • BGProcessingTask:长时任务(数分钟),用于维护、数据处理或清理;仅在设备空闲且(可选)充电时运行,可设置 requiresNetworkConnectivity 与 requiresExternalPower。
  • BGContinuedProcessingTask(iOS 26+、iPadOS 26+):由前台用户操作发起、在后台继续运行的任务,系统通过 Live Activity 显示进度,并遵循 ProgressReporting;可设置 strategy 为 .queue(尽快开始)或 .fail(无法立即运行则提交失败),并可通过 BGTaskScheduler.supportedResources 检查 .gpu 等所需资源。
  • 后台 URLSession 下载:使用 URLSessionConfiguration.background,即使应用被挂起或终止,传输仍由系统在进程外继续。
  • 后台推送触发:静默推送(payload 中设置 content-available: 1)短暂唤醒应用以获取新内容。

使用方式

  1. Info.plist 配置:在 BGTaskSchedulerPermittedIdentifiers 中声明每个任务标识符,否则 submit(_:) 会抛出 BGTaskScheduler.Error.Code.notPermitted;同时启用所需的 UIBackgroundModes(fetch 用于 BGAppRefreshTask,processing 用于 BGProcessingTask)。在 Xcode 的 target > Signing & Capabilities > Background Modes 中启用 "Background fetch" 与 "Background processing"。
  2. 注册处理器:必须在应用启动完成前注册。UIKit 在 application(_:didFinishLaunchingWithOptions:) 中注册,SwiftUI 在 App 的 init 中注册;using 传 nil 表示使用默认后台队列。
  3. 调度任务:创建对应 TaskRequest(如 BGAppRefreshTaskRequest、BGProcessingTaskRequest、BGContinuedProcessingTaskRequest),设置 earliestBeginDate 等属性后调用 BGTaskScheduler.shared.submit(request)。
  4. 处理任务:在处理器中先重新调度下一次任务,再执行工作;为每个代码路径调用 task.setTaskCompleted(success:),并设置 task.expirationHandler 以取消在途工作,因为系统可能随时收回时间。
  5. 后台 URLSession:配置 isDiscretionary 与 sessionSendsLaunchEvents,使用 delegate(而非 async/闭包);在 didFinishDownloadingTo 返回前将文件从临时目录移出;在 AppDelegate 的 handleEventsForBackgroundURLSession 中保存 completionHandler,并在 urlSessionDidFinishEvents(forBackgroundURLSession:) 中调用。
  6. 后台推送:启用 "Remote notifications" 并注册 registerForRemoteNotifications(),在 didReceiveRemoteNotification:fetchCompletionHandler: 中及时回调并返回正确结果(.newData / .noData / .failed)。

适用场景

需要短时数据刷新、数据库清理与索引重建、导出照片、后台文件下载,以及通过静默推送拉取新消息等后台工作。

限制与注意事项

  • 任务标识符必须列入 Info.plist,否则提交会抛错。
  • 必须在每个代码路径调用 setTaskCompleted(success:),未标记完成会影响后续调度。
  • 必须设置 expirationHandler,否则系统会非优雅地终止任务。
  • 调度不宜过于频繁(刷新建议 15 分钟以上);earliestBeginDate 只是提示,实际启动时间由系统决定。
  • 不应假设后台时间足够完成长时间操作,工作应设计为增量且可取消(Task.checkCancellation()),避免阻塞式同步工作。
  • BGContinuedProcessingTask 可用性为 iOS 26.0+、iPadOS 26.0+。

文档还包含常见错误对比与审查清单,以及 BGTaskScheduler、BGAppRefreshTask、BGProcessingTask、BGContinuedProcessingTask 等参考链接。