这个问题是对一些过时问题的更新,例如:
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
...
我目前正在使用 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注册一个无限运行的计时器(后台获取)来调用更新消息功能?
iOS背景提取 :定期下载和处理新内容的应用 - >我的使者应用
答案 0 :(得分:2)
你说:
应用程序必须能够每分钟通过Json请求检查用户的新消息
不,这绝对不是正确的做法。如果你这样做,你将杀死设备的电池并咀嚼用户的数据计划。苹果公司绝不会让你的应用程序运行超过他们允许应用程序完成有限长度后台任务的几分钟。
在他们的App Programming Guide for iOS: Implementing Long-Running Tasks中,Apple非常具体地说明允许哪些任务在后台保持应用程序主动运行(例如VOIP,音乐,导航等)。聊天不是其中之一。并且App Store Review Guidelines很清楚,后台操作模式只能用于各自的指定目的。
所以,这就引出了一个正确的问题,即当应用程序处于非活动状态时,只要某个服务器上有可用数据,应用程序就会告诉用户什么是正确的方法。答案是push notifications。是的,它涉及比您可能正在考虑的更复杂的服务器架构,但它是实现所需的UX的唯一方法,即及时通知用户某些传入的聊天消息。 (后台提取是另一种方法,但不会在用户期望从聊天应用程序发出的频率附近调用它。)
顺便说一下,在应用程序处于活动状态时,应该不鼓励这种反复轮询某个Web服务的技术。人们通常会使用套接字,而不是您的应用反复询问是否有可用的数据,服务器会在有可用于该开放套接字的数据时告诉您的应用。它的效率更高,并且也会提供响应更快的用户体验。为什么等一下,套接字可以立即告诉你。
答案 1 :(得分:0)
而不是后台应用刷新。你应该做的是使用帖子通知。
1. A user X sends a message to Server to send to Y (Payload)
2. The server has a unique reference to the phone that user Y has
and sends a notification to him, that he has received a new message from X.
3. If user opens the app, he will then download the new message.
认为这就是whatsapp的工作方式是合情合理的,因为每分钟运行后台刷新都会耗尽电池。
这样用户不会每分钟查看邮件,他会在收到新邮件时收到新通知。
这可以通过亚马逊的SNS服务来实现,文档很清楚。