【发布时间】:2019-10-24 14:37:27
【问题描述】:
我只为自己制作一个 iOS 应用程序。当应用程序在后台时,我需要每 30 分钟执行一次某些代码。
因为我只是这个应用程序的用户,所以不必担心连击率和苹果审查过程。我可以使用任何/所有背景模式 VOIP、音乐等。
是否可以每 30 分钟在后台运行该代码? 请指导我的方向。
【问题讨论】:
我只为自己制作一个 iOS 应用程序。当应用程序在后台时,我需要每 30 分钟执行一次某些代码。
因为我只是这个应用程序的用户,所以不必担心连击率和苹果审查过程。我可以使用任何/所有背景模式 VOIP、音乐等。
是否可以每 30 分钟在后台运行该代码? 请指导我的方向。
【问题讨论】:
有可能。
一种方法是创建一个虚假的 VPN 数据包隧道扩展。并将您的代码放在 VPN 管理器类中。 VPN 扩展部分将在您的应用处于后台时继续运行,甚至由用户强制执行。
你可以用这个方法写你的代码
NEPacketTunnelProvider
override func startTunnelWithOptions(options: [String : NSObject]?, completionHandler: (NSError?) -> Void) {
fetchData()
}
func fetchData() {
// Do not use the NSTimer here that will not run in background
let q_background = DispatchQueue.global(qos: .background)
let delayInSeconds: Double = 300.0 // seconds
let popTime = DispatchTime.now() + DispatchTimeInterval.seconds(Int(delayInSeconds))
q_background.asyncAfter(deadline: popTime) {
// Fetch your data from server and generate local notification by using UserNotifications framework
fetchData()
}
}
【讨论】:
为什么不选择Background Fetch?
它适用于新闻或社交媒体等应用程序,因此应用程序甚至可以在用户交互之前获得最新数据。它允许按原样定期后台执行。
一个简单的调用将每小时获取数据。
// Fetch data once an hour.
UIApplication.shared.setMinimumBackgroundFetchInterval(3600)
最后,它不是一种解决方法或任何私有 API。您的应用也会被应用商店接受。
【讨论】:
setMinimumBackgroundFetchInterval(_:) 字面上设置了 MINIMUM 间隔,因此 iOS 可以在该最小间隔之后的任何时间触发获取。例如,如果您将最小间隔设置为 3600 秒(一小时),则提取可以在一个小时、两个小时、三个小时甚至一天内发生。如果你滥用它,它有很多限制和惩罚。见Apple documentation
BackgroundTasks 框架实际上是同一个东西,但名称不同。