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

时间:2017-05-11 15:08:47

标签: ios objective-c iphone swift background-process

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

在iOS上,您无法按照您的描述进行此操作。当您的应用处于后台或未运行时,您无法定期安排任务。您也无法控制iOS是否在后台运行时决定终止您的应用,因此"未运行"是一个你需要处理的案例(你不能随意在后台继续运行)。

我不确定我是否理解服务器方面的事情。如果您的服务器正在操作数据直到它可以接受,并且它可以发送推送通知,为什么它需要等待来自手机的传入请求?为什么不在数据就绪时发送推送?如果应用确定了什么"可接受",可能让应用告诉服务器它想要什么,以便服务器知道何时发送推送。

有几种选择可以接近你描述的内容。如果你实现"后台提取"在您的应用中,iOS会在应用未运行时启动该应用,并让它在后台进行网络通话。但是,并不能保证这种情况发生的频率。这在Apple's background execution docs

中有所描述

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

  

无声通知并不意味着让您的应用在后台保持清醒,也不是用于高优先级更新。 APN将无声通知视为低优先级,如果总数过多,可能会完全限制其传递。实际限制是动态的,可以根据条件进行更改,但尝试不要每小时发送多个通知。

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

答案 1 :(得分:0)

如果您的应用具有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在遇到事情时执行任务。如果您不想在修复时间间隔内执行,可以使用此功能。