【问题标题】:iOS 13 - Using BGTaskScheduler doesn't work all the timeiOS 13 - 使用 BGTaskScheduler 并不总是有效
【发布时间】:2020-04-14 17:20:52
【问题描述】:

问题: 我想在应用进入后台 5 秒后运行一个简单的函数。

我必须实现 BGTaskScheduler,才能支持 iOS 13。 BackgroundTask 的旧实现适用于旧 iOS 版本。

我按要求添加了后台模式(BLE 附件被打勾是因为我们在这个函数中执行了一个小的 BLE 操作):

然后,我根据文档准备了 Info.plist(Identifier is fake 仅针对 StackOverflow 问题):

didFinishLaunchingWithOptions 结束之前,我注册了我的 BackgroundTask:

if #available(iOS 13.0, *) {
        BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.MyID", using: .global()) { (task) in
            print("My backgroundTask is executed NOW!")
            task.expirationHandler = {
                task.setTaskCompleted(success: true)
            }
        }
    }

现在,当应用运行 didEnterBackground 方法时,我提交了一个 BackgroundTaskRequest:

if #available(iOS 13.0, *) {
            do {
                let request = BGAppRefreshTaskRequest(identifier: "com.example.MyID")
                request.earliestBeginDate = Calendar.current.date(byAdding: .second, value: 5, to: Date())
                try BGTaskScheduler.shared.submit(request)

                print("Submitted task request")
            } catch {
                print("Failed to submit BGTask")
            }
        } 

这里的问题是它非常不一致。苹果保证任务不会在给定日期之前执行,但不保证它会在准确的时间执行(我没问题,有一点延迟)。 但是,当我运行该应用程序时,它并没有 100% 工作,无论我是否为任务请求提供延迟(使用 earlyBeginDate)所以它曾经先尝试 7 秒(而不是 5 秒),下次我提交该任务耗时 26 秒,第三次从未到达关闭。

我是否以错误的方式实施 BackgroundTask?我在整个互联网上搜索了一些答案,但没有遇到任何人遇到这个问题。

【问题讨论】:

  • 只有在系统决定时才会执行任务。它可以在设备充电等时执行。正如你所说,不能保证确切的成功。观看 WWDC 2019 会议 #707 了解更多信息。
  • @badhanganesh,感谢您的快速回复。您是否有解决方案在进入后台后 X 秒(而不是几分钟..)后运行功能? iOS 13。
  • 使用应用程序后台任务。这会给你 30 秒的额外时间。
  • @matt 我用过它,每次我用它似乎都不能完全正常工作,你能发布一个使用 5 秒计时器的答案吗?我按照 Apple 文档的说法进行了尝试。

标签: ios swift taskscheduler background-task ios-background-mode


【解决方案1】:

正如 badhanganesh 所说,似乎只有当系统决定执行该任务时才会执行该任务。 苹果在WWWDC 2019, session #707期间说过。

【讨论】:

  • @mykolaj,我相信可能有某种方法可以做到这一点,这可能就是人们投票反对的原因。由于产品定义发生了变化,我停止了工作,我没有时间去解决它。
  • 没有。我认为人们之所以投反对票,是因为他们知道这件事。系统将决定您是 100% 正确的。在 BGTaskSchedular 中没有其他方法可以做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2015-06-28
相关资源
最近更新 更多