本参考文档系统整理 iOS 后台执行的完整 API 用法,配有来自 WWDC 会话的代码示例,覆盖任务注册、调度、处理、测试与系统约束等方面。相关技能包括 axiom-background-processing(决策树与模式)与 axiom-background-processing-diag(故障排查)。
一、主要用途 面向需要实现 iOS 后台执行的开发者,作为后台任务 API 的查阅与示例参考。文档按功能划分为多个部分,从任务标识配置到各类后台任务实现逐一展开。
二、主要能力与内容结构
- BGTaskScheduler 注册:包含 Info.plist 配置(BGTaskSchedulerPermittedIdentifiers 与 UIBackgroundModes)、register(forTaskWithIdentifier:using:launchHandler:) 的参数说明,以及注册时机的注意事项(应在 application(_:didFinishLaunchingWithOptions:) 返回 true 之前注册,而非在 viewDidLoad、按钮回调或异步回调中)。
- BGAppRefreshTask:用于让应用内容在一天中保持新鲜,运行时长约 30 秒;文档给出调度方法(含 earliestBeginDate 为最小延迟而非精确时间)、错误分支(notPermitted、tooManyPendingTaskRequests、unavailable)以及处理器实现步骤(先设置 expirationHandler、再调度下一次刷新、执行工作、最后调用 setTaskCompleted)。
- BGProcessingTask:用于可延迟的维护工作(数据库清理、ML 训练、备份),运行时长可达数分钟,通常在充电时夜间运行;文档说明 requiresExternalPower、requiresNetworkConnectivity 等约束属性,并指出当 requiresExternalPower = true 时会禁用 CPU Monitor,以充分利用硬件。
- BGContinuedProcessingTask(iOS 26+):用于在应用进入后台后继续用户发起的工作,并在系统 UI 中显示进度;不适用于自动任务、维护或同步。文档给出通配符标识配置、动态注册、提交请求(title、subtitle、strategy 为 .fail 或 .enqueue)以及强制进度回报(无进度更新的任务会被自动过期),并提及 GPU 资源检查(supportedResources 包含 .gpu)。
- beginBackgroundTask:用于应用进入后台时完成约 30 秒内的关键工作(状态保存、完成上传),强调工作完成后立即调用 endBackgroundTask。
- 后台 URLSession:用于大文件下载/上传,即使在应用终止后仍继续;包含配置(sessionSendsLaunchEvents、isDiscretionary、超时)、下载任务启动、AppDelegate 处理回调,以及 didFinishDownloadingTo 中必须立即移动文件的注意事项。
- 测试后台任务:提供 LLDB 调试命令(_simulateLaunchForTaskWithIdentifier、_simulateExpirationForTaskWithIdentifier)、测试流程、Console 过滤(subsystem:com.apple.backgroundtaskscheduler)以及 getPendingTaskRequests 检查已调度任务。
- 限流与系统约束:列出 7 个调度因素,并给出低电量模式、后台 App 刷新状态、热状态(thermalState)的检查方式。
- 后台推送:包含静默推送负载、APNS 优先级(5 为可延迟、省电,10 为即时)、处理器实现与限流行为说明。
- SwiftUI 集成:提及 backgroundTask 修饰符。
三、使用方式 开发者可依据各部分的代码示例,在 Info.plist 中声明任务标识与后台模式,在应用启动完成前注册处理器,按场景选择相应的任务类型进行调度与处理;测试时可通过 LLDB 命令模拟任务启动与过期。
四、适用场景 适用于需要实现后台刷新的内容更新、可延迟的维护性处理、用户发起并需在后台继续的导出/发布类工作、进入后台时的关键收尾工作,以及大文件后台传输等 iOS 开发场景。
五、限制与注意事项 文档指出:任务标识区分大小写且必须与 Info.plist 完全匹配;BGAppRefreshTask 运行时长约 30 秒,beginBackgroundTask 约 30 秒且不保证;BGProcessingTask 的 earliestBeginDate 建议保持在一周以内,否则可能被跳过;BGContinuedProcessingTask 必须回报进度,否则会被自动过期;静默推送受速率限制,不应期望每次推送都触发启动。文档同时列明多种系统限流与约束因素。