IOS 13 上的后台任务 (BGTaskScheduler)

Background tasks on IOS 13 (BGTaskScheduler)

我将 BGTaskScheduler 用于后台任务,如下所述:https://developer.apple.com/documentation/backgroundtasks/bgtaskscheduler

我的问题是:这个计划任务是否也应该在设备重启后或在我手动终止应用程序后工作?如果没有,还有其他选择吗?

答案是否定的,我不知道其他选择。
我刚测试过:
1 分钟后我启动了后台任务,在后台任务处理程序中,我在用户默认设置中设置了一个标志。 然后我手动杀死了应用程序。
几分钟后,我打开应用程序并读出用户默认值,但未设置标志。
这向我表明后台任务只能在后台启动,如果它们没有被杀死,同样适用,如果设备已经重新启动。

不会,重启设备或手动关闭应用程序后,不会自动执行或重新启动后台任务。

这是因为你的应用程序的 State 将被更改

Apple Docs中给出了AppDelegate的各种方法,分别处理不同States的App(ForeGround/BackGround/Terminated等)

  1. 如果您手动终止您的应用程序,那么 applicationWillTerminate(_ application: UIApplication) 将在您的 AppDelegate.swift 文件中执行(因此,您可以设置一些要执行的操作,这些操作将在应用程序被手动终止之前执行。 )

请注意,当它执行时,您的任何后台任务也将终止并且您应用的 StateBackGround -> Terminated

  1. 当我们关闭或重启设备时,这是一个外部事件,与您的应用程序无关,因此我们无法确定应用程序的State

即使您的应用程序在后台执行任何 BGTask,如果设备将关闭,应用程序甚至不会执行 applicationWillTerminate 或任何AppDelegate方法

正如 Reinhard 和 Nayan 所说,对问题的直接回答是否定的。

另请注意:即使您的应用未终止,任务也只会在系统决定 运行 时执行。无法保证执行时间。参考 Advances in App Background Execution

解决方法: 处理后台执行的方法之一是在后台处理通知。

Apple 引自 Local and Remote Notification Programming Guide

When a background update notification is delivered to the user’s device, iOS wakes up your app in the background and gives it up to 30 seconds to run. In iOS, the system delivers background update notifications by calling the application:didReceiveRemoteNotification:fetchCompletionHandler: method of your app delegate. Use that method to initiate any download operations needed to fetch new data. Processing remote notifications in the background requires that you add the appropriate background modes to your app.