探索后台任务执行方面的最新进展,并了解系统如何进行运行时调度。我们将讨论如何充分利用后台运行时,让你的 app 既能在后台提供功能,又能保持出色的前台体验。我们还将介绍各种 api 如何为你的 app 提供后台运行时环境,以及每个 api 是怎样针对不同用例量身定制的 — 其中包括 ios 和 ipados 26 中的新 api,这些 api 让你的 app 能够在从前台过渡到后台时顺利完成任务。

视频封面
视频地址

此文章由AI生成,可能存在错误,如有问题,请联系djs66256@163.com

后台任务处理:iOS与iPadOS 26的后台运行时优化

引言

在现代移动操作系统中,后台任务处理一直是开发者面临的重要挑战。iOS系统以其严格的资源管理和卓越的电池优化著称,同时也为开发者提供了多种API来实现高效且用户友好的后台功能。WWDC演讲深入探讨了iOS和iPadOS 26中后台任务处理的最新进展,特别是新引入的BGContinuedProcessingTask API,为开发者提供了更灵活的后台任务管理工具。

前台与后台的运行机制

当应用在前台运行时,它拥有最高优先级,可以完全访问系统资源,包括CPU、内存和网络等。此时的应用界面是设备的焦点,用户可以享受开发者精心打造的交互体验。

但当用户离开应用时,该应用便进入后台状态。默认情况下,后台应用会被系统挂起,不再占用CPU资源。这种设计有效地保护了电池寿命,维护了用户隐私,并为前台应用释放了宝贵的系统资源。然而,在某些情况下,应用可以请求后台执行时间来完成关键任务。

后台任务的行为约束

iOS系统对后台任务执行设定了明确的约束和原则:

  1. 能耗管理:系统会在设备唤醒时合并工作,减少全天的非必要后台活动。
  2. 资源优先级:前台应用享有内存、CPU时间和网络带宽的优先使用权。
  3. 弹性设计:后台任务必须能够处理提前终止的情况,并保存中间状态。
  4. 用户控制:用户通过低电量模式、后台应用刷新等设置影响任务调度。

iOS 26还引入了更详细的电池性能分析工具,让用户能够清晰地了解各个应用对电池寿命的影响。

后台任务API概述

iOS提供了多种后台任务API,每种都针对特定用例进行了优化:

1. BGAppRefreshTask

此API最适合用于从服务器获取最新内容。系统会根据应用使用历史智能调度这些任务,频繁使用的应用更可能获得后台运行机会。

在SwiftUI中使用BGAppRefreshTask的示例:

import BackgroundTasks
import SwiftUI

@main
struct ColorFeed: App {
    var body: some Scene {
        WindowGroup {
            // ...
        }
        .backgroundTask(.appRefresh("com.colorfeed.wwdc25.appRefresh")) {
            await self.handleAppRefreshTask()
        }
    }
}

2. 后台推送通知

与BGAppRefreshTask不同,后台推送通知是由服务器触发的内容更新机制。这些通知以低优先级发送并合并处理,以减少系统开销。

3. BGProcessingTask

此API设计用于非时间敏感的维护工作,如运行ML模型或数据库清理。开发者可以配置任务仅在特定条件下运行(如设备充电且联网时)。

import BackgroundTasks
import UIKit

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        BGTaskScheduler.shared.register(
            forTaskWithIdentifier: "com.example.apple-samplecode.ColorFeed.db_cleaning",
            using: nil
        ) { task in
            self.handleAppRefresh(task: task as! BGProcessingTask)
        }
    }
    
    func submitProcessingTaskRequest() {
        let request = BGProcessingTaskRequest(
            identifier: "com.example.apple-samplecode.ColorFeed.db_cleaning"
        )
        request.requiresNetworkConnectivity = true
        request.requiresExternalPower = true
        
        BGTaskScheduler.shared.submit(request)! 
    }
}

4. 开始和结束后台任务

对于需要在应用转入后台时完成的关键工作(如保存状态或关闭资源),可以使用beginBackgroundTask和endBackgroundTask API:

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
    
    func saveState() { /*  ... */ }
    
    func handlePersistence() {
        let app = UIApplication.shared
        guard backgroundTaskID != .invalid else { return }
        backgroundTaskID = app.beginBackgroundTask(withName: "Finish Export") {
            app.endBackgroundTask(self.backgroundTaskID)
            self.backgroundTaskID = .invalid
        }
        
        self.saveState()
        
        app.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

iOS 26新特性:BGContinuedProcessingTask

iPadOS和iOS 26引入了BGContinuedProcessingTask,这是专门为支持用户发起的后台操作而设计的新API。与之前的后台任务不同,持续处理任务具有以下特点:

  1. 明确用户意图:每个任务必须由明确的用户动作(如按钮点击)触发
  2. 可视化进度:系统提供UI展示任务进度,用户可随时取消
  3. 动态标识符:支持通配符形式的动态任务标识符
  4. GPU支持:在支持的设备上可进行后台GPU处理

持续处理任务的实现

首先需要在Info.plist中添加任务标识符。然后通过以下代码注册和管理任务:

import BackgroundTasks

func handleDialogConfirmation() {
    BGTaskScheduler.shared.register("com.colorfeed.wwdc25.userTask") { task in
        let task = task as! BGContinuedProcessingTask
                                                                      
        var shouldContinue = true
        task.expirationHandler = {
            shouldContinue = false
        }
        
        task.progress.totalUnitCount = 100
        task.progress.completedUnitCount = 0
        
        while shouldContinue {
            // 执行某些工作
            task.progress.completedUnitCount += 1
        }
        
        task.setTaskCompleted(success: true)
    }
}

提交持续处理任务请求时需要提供清晰的任务描述:

import BackgroundTasks

func submitContinuedProcessingTaskRequest() {
    let request = BGContinuedProcessingTaskRequest(
        identifier: "com.colorfeed.wwdc25.userTask",
        title: "简洁标题",
        subtitle: "实用且信息丰富的副标题"
    )
    
    request.strategy = .fail
    
    BGTaskScheduler.shared.submit(request)!
}

开发者还可以指定任务提交策略:

  • 默认策略:如果不能立即运行,任务将加入队列
  • .fail策略:如果不能立即运行,提交将失败

最佳实践与总结

为了实现高效的后台任务处理,开发者应遵循以下原则:

  1. 明确任务目标:确保每个后台任务只做一件事并高效完成
  2. 尊重系统约束:考虑电池状态、网络条件和用户偏好
  3. 弹性设计:任务应能处理中断并保存中间状态
  4. 合理使用新API:BGContinuedProcessingTask最适合用户明确发起的操作

iOS的后台任务API生态系统为开发者提供了丰富的工具,从简单的状态保存到复杂的持续处理任务。iOS 26引入的BGContinuedProcessingTask特别适合那些需要将前台操作平滑过渡到后台完成的使用场景,如文件导出或内容发布。

通过合理利用这些API,开发者可以创造更智能、更高效的后台体验,同时保持iOS系统一贯的流畅性和电池效率。

相关文档

Background Tasks
Performing long-running tasks on iOS and iPadOS