定期以后台模式 (iOS) 发送 HTTP 请求

Send HTTP Requests in Background Mode (iOS) Periodically

我正在为我的应用程序开发一个很棒的功能,它需要在后台定期发送 HTTP 请求。

我已经在这里阅读了很多文章和讨论,但还没有找到解决方案,因为我在 whosebug.com 上遇到的所有建议都只能部分解决问题。

让我详细解释一下我希望我的应用程序做什么。

假设有一个带有 API 的网站,我想定期发送请求(当应用程序处于后台模式时)以检查网站上的数据状态。如果数据状态可以接受,我会向用户发送推送通知,通知他此时数据是正确的。

有人可以提出如何在 iOS 应用程序中实现这个想法的解决方案吗?

如果您的应用可以具有 background-running 功能,那么您可以做一些事情。

  • 至运行定期你将需要一个Timer(NSTimer)。
  • 您将需要一个方法来执行 HTTP 请求。

例如:

Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(handleHTTPRequest), userInfo: nil, repeats: true)

func handleHTTPRequest() {
  // fetch and change the state of data
}

另一种方法是让 delegates 在发生某些事情时执行任务。当您不想按固定时间间隔执行时,可以使用它。

在 iOS 上,您无法执行此操作,正如您所描述的那样。无论您的应用程序是否在后台,您都无法安排定期执行的任务 运行。您也无法控制 iOS 是否决定在后台处于 运行 时终止您的应用程序,因此 "not running" 是您需要处理的情况(您不能只要你愿意,就可以在后台保留 运行。

虽然我不确定我是否理解服务器端的事情。如果您的服务器正在处理数据直到它被接受,并且它可以发送推送通知,为什么它需要等待来自 phone 的传入请求?为什么不在数据准备好后才发送推送?如果应用决定什么是 "acceptable",也许让应用告诉服务器它想要什么,以便服务器知道何时发送推送。

有几个选项可以接近您所描述的内容。如果您在您的应用程序中实施 "background fetch" 功能,iOS 将在它不是 运行 时启动该应用程序,并让它在后台进行网络调用。但是,无法保证这种情况发生的频率。 Apple's background execution docs

中对此进行了描述

另一个选项是 "silent" 推送通知。如果您的服务器发送其中之一,iOS 可以在后台启动应用程序来处理通知。如有必要,该应用程序可以进行网络呼叫。您可以随时发送这些内容,但 Apple 警告不要过度:

Silent notifications are not meant as a way to keep your app awake in the background, nor are they meant for high priority updates. APNs treats silent notifications as low priority and may throttle their delivery altogether if the total number becomes excessive. The actual limits are dynamic and can change based on conditions, but try not to send more than a few notifications per hour.

Apple's push notification docs 中描述了静默推送。