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

Posted

技术标签:

【中文标题】定期在后台模式下发送 HTTP 请求 (iOS)【英文标题】:Send HTTP Requests in Background Mode (iOS) Periodically 【发布时间】:2017-05-11 15:08:46 【问题描述】:

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

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

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

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

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

【问题讨论】:

检查预取功能:developer.apple.com/reference/uikit/uitableview/…. @MaxPevsner 谢谢,但在我看来,这种方法绝对不适用于这种情况。而且我需要某种“软件设计”的答案——与某些工具无关。 静默推送通知,一旦在设备上收到,您就可以执行一些任务。全后台模式仅适用于特定功能developer.apple.com/library/content/documentation/iPhone/… 【参考方案1】:

正如你所描述的,在 iOS 上你不能这样做。当您的应用程序处于后台或未运行时,您无法安排任务定期发生。您也无法控制 iOS 在后台运行时是否决定终止您的应用程序,因此“未运行”是您需要处理的情况(您不能只在后台运行很长时间随心所欲)。

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

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

另一个选项是“静默”推送通知。如果您的服务器发送其中之一,iOS 可以在后台启动应用程序来处理通知。如有必要,该应用程序可以进行网络调用。您可以在任何时候发送这些,但 Apple 警告不要过度发送:

静默通知并不是为了让您的应用在后台保持清醒,也不是为了高优先级更新。 APNs 将静默通知视为低优先级,如果总数过多,可能会完全限制其传递。实际限制是动态的,可以根据情况而变化,但尽量不要每小时发送超过几个通知。

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

【讨论】:

感谢您如此详细的解释!问题是我没有自己的服务器——我只能向服务发送请求并获得响应。【参考方案2】:

如果您的应用可以具有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 在发生某些事情时执行任务。当您不想按固定时间间隔执行时,可以使用它。

【讨论】:

当应用程序在后台时,Timer 不会可靠地工作(可能根本不会)。即便如此,iOS 也可能会终止该应用程序。 @TomHarrington,由于您是经验丰富的开发人员,我想请您帮忙。你有什么建议? :) 嗨@TomHarrington 我已经明确写过,即如果他有backgorund mode 能力,除非任务将在正常后台模式下被杀死。 @TomHarrington 感谢您的反馈。我会阅读更多关于它的内容。

以上是关于定期在后台模式下发送 HTTP 请求 (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

后台模式下的多点连接

IOS - 从UNNotificationAction触发后,当应用程序处于后台时发送http请求

在后台模式下运行函数的替代方法

后台发送http请求通用方法,包括get和post

Java后台模拟发送http的get和post请求,并测试

iOS 在后台模式下从广告中省略制造商数据