iOS 13 全新后台任务 API
Framework - Background Tasks
available: iOS 13.0+ Beta
iOS 13 推出了全新的 Background Tasks API,并将曾经的后台刷新 API 并入其中,易名为 BGAppRefreshTaskRequest,使用方式几乎不变。
让人新奇不是这个 Refresh Task,而是 Processing Task:
BGProcessingTaskRequest
A request to launch your app in the background to execute a processing task that can take minutes to complete.
使用新的 BGProcessingTask,你可以在 App 处于前台时,将一个后台任务提交给 iOS。随后当你的 App 处于后台时,iOS 就有可能会唤起你,让你执行这个任务。
你会有长达数分钟的时间去完成这个任务。相比之下,BGAppRefreshTask,或者说从前的后台刷新 API,则仅有可怜的上限 30 秒的时间。
至于将任务提交给 iOS 后,iOS 会在什么时候执行,基本都取决于用户的状态。
完全由用户掌控的,是其使用你的 App 的频率,根据 WWDC Session 的说法推测,如果用户超过 1 周没有打开过你的 App,很有可能你的任务会被无限期延迟;如果 App 超过一个月未启动,基本上没可能会轮到你。
开发者一定程度上可以控制的有三:
最早开始时间,比如我要我的任务至少 3 天后再执行
是否需要网络,若指定为「需要」,则任务仅在网络连接可用时执行
是否需要外接电源,若指定为「需要」,则任务仅在设备充电时执行
这里最刺激的是最后一点。
如果你将后台任务指定为「需要外接电源」,在任务执行时,iOS 会关闭 CPU 监视器,允许任务使用设备全部的性能。
对用户来说,升级到 iOS 13 之后,有的 App 可能会在你手机半夜充电的时候跑一些繁重的任务,比如机器学习(训练人工智能)。
总而言之,新 API 让设备的硬件资源调配在时间维度上更为合理:iOS 更倾向于在设备空闲的时候执行 BGProcessingTask,比如晚上人睡了、手机充着电的时候。
而 BGAppRefreshTask 由于仅有不到 30 秒的执行时间,往往用来做强度更轻、与 UI(用户交互)更相关的任务,对此,iOS 会根据用户开启 App 的时间段(比如每天早上打开新闻 App),在有需要的时候执行(赶在你每天看新闻的点之前刷新数据)。