【问题标题】:Background tasks on IOS 13 (BGTaskScheduler)IOS 13 上的后台任务(BGTaskScheduler)
【发布时间】:2020-05-21 05:54:15
【问题描述】:

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

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

【问题讨论】:

  • 我不知道为什么这个问题被否决了。我认为这是一个有效且有趣的编程问题。顺便说一句,不给出理由就投反对票不是很有用...

标签: ios swift xcode11


【解决方案1】:

不会,重启设备或手动杀死应用后,后台任务将不会执行或自动重新启动。

那是因为你的应用的State会被改变

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

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

请注意,当它执行时,您的任何后台任务也将终止,并且您的应用程序的 State 将从 BackGround 更改为 -> Terminated

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      来自Local and Remote Notification Programming Guide的苹果报价

      当后台更新通知发送到用户的设备时,iOS 会在后台唤醒您的应用,并为其提供最多 30 秒的运行时间。在 iOS 中,系统通过调用您的应用程序委托的 application:didReceiveRemoteNotification:fetchCompletionHandler: 方法来传递后台更新通知。使用该方法启动获取新数据所需的任何下载操作。在后台处理远程通知需要您为应用添加适当的后台模式。

      【讨论】:

        猜你喜欢
        • 2020-01-30
        • 2020-01-28
        • 1970-01-01
        • 2020-04-14
        • 2017-10-01
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多