这个问题是对一些过时问题的更新,例如:
- how to call function after every 1 hour?(Swift). Background fetch work when app is terminated?
- Sending Latitude and Longitude to Server when app is in background的
- Periodic iOS background location updates的
- ...
我目前正在使用Swift 4为iOS开发一个简单的移动的应用程序。
这是一个类似e.g. WhatsApp
的信使应用程序,因为新消息必须立即交付,应用程序必须能够通过JSON请求每分钟为用户检查新消息。
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
func registerBackgroundTask() {
backgroundTask = UIApplication.shared.beginBackgroundTask { endBackgroundTask() }
assert(backgroundTask != UIBackgroundTaskInvalid)
}
func endBackgroundTask() {
print("Background task ended.")
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
字符串
到目前为止-当应用程序处于后台模式时,大约2分钟后应用程序终止,getnewmessages-timer interval
停止并打印出"Background task ended"
。
如何使用Swift注册一个无限运行的定时器(后台取数),调用update messages函数?
iOS后台取 *:定期下载和处理新内容的应用-->我的信使应用
2条答案
按热度按时间d8tt03nd1#
你说:
应用程序必须能够每分钟通过Json请求检查用户的新消息
这是不可取的。如果你这样做,你会耗尽设备的电池,并破坏用户的数据计划。苹果不会让你的应用程序运行超过30秒,他们允许应用程序finish finite-length background tasks。
在Configuring background execution modes中,Apple列举了允许应用在后台主动运行的特定任务(例如:VOIP、音乐、导航等)。聊天不是其中一项任务。和App Store Review Guidelines都清楚,后台操作模式只能用于它们各自的指定目的。
因此,这就引出了一个正确的问题,即当某个服务器上有数据可用时,应用程序在未激活时,如何正确地告诉用户。答桉是push notifications。是的,它涉及到比您可能想象的更复杂的服务器架构,但这是实现您所期望的UX的唯一方法,即及时通知用户一些传入的聊天消息。(后台获取是另一种方法,但它的调用频率不会接近用户对聊天应用的期望。)
顺便说一句,这种反复轮询某个Web服务的技术在应用程序处于活动状态时也不应该被鼓励。通常会使用套接字,而不是你的应用反复询问是否有可用的数据,服务器会告诉你的应用,当有数据可用于该开放的套接字。它的效率要高得多,并将提供一个更响应的用户体验,太。当套接字可以立即告诉你的时候,为什么要等待周期性的轮询(即使是几秒钟)呢?
rryofs0p2#
而不是后台应用程序刷新。你应该做的是使用后通知。
字符串
如果认为这就是WhatsApp的工作原理,那是合理的,因为每分钟都在刷新后台,这会消耗电池。
这样,用户就不会每分钟都轮询消息,当新消息到达时,他将收到新的通知。
这可以用amazon的SNS服务来实现,文档中写得相当清楚。