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等)
- 如果您手动终止您的应用程序,那么
applicationWillTerminate(_ application: UIApplication)
将在您的 AppDelegate.swift
文件中执行(因此,您可以设置一些要执行的操作,这些操作将在应用程序被手动终止之前执行。 )
请注意,当它执行时,您的任何后台任务也将终止并且您应用的 State
从 BackGround
-> Terminated
- 当我们关闭或重启设备时,这是一个外部事件,与您的应用程序无关,因此我们无法确定应用程序的
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.
我将 BGTaskScheduler 用于后台任务,如下所述:https://developer.apple.com/documentation/backgroundtasks/bgtaskscheduler
我的问题是:这个计划任务是否也应该在设备重启后或在我手动终止应用程序后工作?如果没有,还有其他选择吗?
答案是否定的,我不知道其他选择。
我刚测试过:
1 分钟后我启动了后台任务,在后台任务处理程序中,我在用户默认设置中设置了一个标志。
然后我手动杀死了应用程序。
几分钟后,我打开应用程序并读出用户默认值,但未设置标志。
这向我表明后台任务只能在后台启动,如果它们没有被杀死,同样适用,如果设备已经重新启动。
不会,重启设备或手动关闭应用程序后,不会自动执行或重新启动后台任务。
这是因为你的应用程序的 State
将被更改
在Apple Docs中给出了AppDelegate
的各种方法,分别处理不同States
的App(ForeGround/BackGround/Terminated等)
- 如果您手动终止您的应用程序,那么
applicationWillTerminate(_ application: UIApplication)
将在您的AppDelegate.swift
文件中执行(因此,您可以设置一些要执行的操作,这些操作将在应用程序被手动终止之前执行。 )
请注意,当它执行时,您的任何后台任务也将终止并且您应用的 State
从 BackGround
-> Terminated
- 当我们关闭或重启设备时,这是一个外部事件,与您的应用程序无关,因此我们无法确定应用程序的
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.