繁体   English   中英

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

[英]Send HTTP Requests in Background Mode (iOS) Periodically

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

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

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

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

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

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

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

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

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

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

Apple 的推送通知文档中描述了静默推送。

如果您的应用程序可以具有后台运行功能,那么您可以做一些事情。

  • 要定期运行,您将需要一个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 后台执行限制

Questions

如何让我的应用程序在后台持续运行?

如果我安排了一个计时器,如何在屏幕锁定时触发它?

如何每 15 分钟在后台运行一次代码?

如何设置在后台运行的网络服务器?

我的应用程序如何在后台为我的另一个应用程序提供 IPC 服务?

Answer from Apple:

所有这些的简短答案是你不能。 iOS 对后台执行有严格的限制。 它的默认行为是在用户将其移至后台后不久暂停您的应用程序; 这种暂停会阻止进程运行任何代码。

Official: https ://developer.apple.com/forums/thread/685525

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM