【问题标题】:How to run iOS app in background forever?如何永远在后台运行iOS应用程序?
【发布时间】:2019-10-24 14:37:27
【问题描述】:

我只为自己制作一个 iOS 应用程序。当应用程序在后台时,我需要每 30 分钟执行一次某些代码。

因为我只是这个应用程序的用户,所以不必担心连击率和苹果审查过程。我可以使用任何/所有背景模式 VOIP、音乐等。

是否可以每 30 分钟在后台运行该代码? 请指导我的方向。

【问题讨论】:

标签: ios swift


【解决方案1】:

有可能。

一种方法是创建一个虚假的 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()
        }
    }

【讨论】:

  • 非常感谢您的意见,我一定会尝试的。基本上,我想每 30 分钟检查一次服务器上是否有任何新数据(我不想要推送通知和套接字连接)。如果有新数据,我会本地通知。
  • 你我可以从服务器获取数据,也可以使用假 VPN 数据包隧道网络扩展生成本地通知。
  • @AmeetDhas 这种每 30 分钟运行一次代码的方法对你有用吗?我正在尝试做同样的事情。
  • @bigreddawg 我在应用商店有一个使用这种方法的工作应用程序。我们每 5 minz 对服务器执行一次 ping 操作。当设备未处于空闲(睡眠)状态时,此方法将继续工作。
  • 如何从主应用调用这个网络扩展代码?
【解决方案2】:

为什么不选择Background Fetch

它适用于新闻或社交媒体等应用程序,因此应用程序甚至可以在用户交互之前获得最新数据。它允许按原样定期后台执行。

一个简单的调用将每小时获取数据。

// Fetch data once an hour.
   UIApplication.shared.setMinimumBackgroundFetchInterval(3600)

最后,它不是一种解决方法或任何私有 API。您的应用也会被应用商店接受。

【讨论】:

  • 这不是很有用,因为setMinimumBackgroundFetchInterval(_:) 字面上设置了 MINIMUM 间隔,因此 iOS 可以在该最小间隔之后的任何时间触发获取。例如,如果您将最小间隔设置为 3600 秒(一小时),则提取可以在一个小时、两个小时、三个小时甚至一天内发生。如果你滥用它,它有很多限制和惩罚。见Apple documentation
  • 它的苹果。如果您的应用程序不渴望资源并且用户实际上从您的应用程序中获取了一些东西并定期访问它,那么苹果将允许执行。在 wwdc 2018 苹果甚至表示,如果用户在每天早上 8 点打开你的应用程序,苹果将确保它拥有所有资源,以确保你的应用程序拥有资源。每个新闻应用都会这样做,以便用户在打开应用后就可以看到数据
  • 你是对的,但只有当你需要在应用程序打开之前预取一些数据时,该解决方案才能很好地工作,但如果你想在精确的时间做其他事情,或者你需要获取一些数据做其他后台任务,比如发送本地通知,这不是很有用。也许新的 iOS 13 API BackgroundTasks 可以很好地满足其他需求。
  • @RomuloBM 新的BackgroundTasks 框架实际上是同一个东西,但名称不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2020-09-21
相关资源
最近更新 更多