UIApplication.shared.beginBackgroundTask 在iOS 13上无法工作

8

UIApplication.shared.beginBackgroundTask 在iOS 13上无法正常工作。有没有其他替代方法可以在iOS 13上实现长时间运行的后台任务呢?但是,在iOS 12及以下版本中,它可以完美地工作。

当应用程序进入后台时,它会在2分钟内被终止,而我希望它能在后台继续运行数小时,因为我们正在后台处理一些内容。

下面是我使用的代码,以便在我的应用程序处于后台时,它可以获得额外的执行时间。我们需要这个额外的执行时间,因为我们会间隔一段时间向服务器发送当前位置。

/// Register background task. This method requests additional background execution time for the app
private func registerBackgroundTask() {
    DispatchQueue.global().async {
        self.backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "BgTask", expirationHandler: {
            // Ends long-running background task
            self.endBackgroundTask()
        })
    }
}

/// Ends long-running background task. Called when app comes to foreground from background
private func endBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = UIBackgroundTaskInvalid
}
2个回答

1
它的工作非常完美。根据定义,它应该延长您的应用程序的后台执行时间几分钟,以便您完成已经开始的任务,如果没有正确完成可能对您的应用程序有害。曾经是10分钟,现在是3分钟。实际上,根据我在网上找到的最新文章,我认为它已经降至30秒。

因此,这绝对不是您需求的正确工具。尝试查看URLSessionConfiguration.background(withIdentifier:),但要注意,因为它存在许多风险和一些错误。

此外,请搜索Dropbox背景位置更新,以了解Dropbox如何解决后台限制问题。

祝你好运


是的,它是30秒,适用于iOS 13。关于URLSessionConfiguration背景,确实更加复杂(您必须使用委托API而不是完成处理程序API;您必须使用文件API进行上传任务等),但在我看来它并不会出现错误。它是一个非常强大和宝贵的工具。我在S.O.上看到的99%的后台URL会话“问题”都是由程序员错误引起的,而不是API本身的任何“错误”。 - Rob

1

有关iOS 13中后台任务的常规建议,请参见WWDC 2019 应用后台执行的进展。但简短的答案是,您不能无限期地在后台运行应用程序。苹果这样做是为了确保应用程序不会消耗用户的电池。

如果您想“定期向服务器发送当前位置”,我建议您查看显著更改位置服务访问位置服务。使用这些服务,操作系统可以在用户位置发生实质性变化时唤醒您的应用程序。

另请参见处理后台位置事件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接