考虑这种情况:
1)启动应用
2)将应用程序置于后台(按“主页”按钮)
3)服务器向客户端发送PUSH通知
4)用户从菜单中单击其图标
恢复应用程序在这种情况下,不会调用didReceiveRemoteNotification和didFinishLaunchingWithOptions,因此如何获取通知?
答案 0 :(得分:2)
简单回答:在这种情况下,你无法得到它。
如果推送通知包含重要的有效负载,那么它不应该包含它,因为你不应该依赖它来做任何重要的事情,因为:
无法保证通知首先发送到设备
用户可以关闭通知
他们可以忽略它们
如果设备在显示时关闭,则会丢失
如果您需要知道服务器是否已发送通知,请在您处于活动状态时建立连接,并询问是否这样做。
答案 1 :(得分:0)
您应该检查applicationWillEnterForeground:
方法。
答案 2 :(得分:0)
我认为如果用户选择忽略推送通知,应用程序将看不到任何内容。首先想到的解决方法是提供一种检查服务器的方法,如果自上次打开应用程序以来发生任何值得推送通知的事情,并将其与本地数据相关联。
我认为这个系统背后的想法是将实际功能与推送通知分开,并确保通知仅用于一个目的 - 通知新数据/事件/等,从而将数据下载和处理留给应用程序一旦它完全在前景。即所有内容都应该在启动顺序中重复,以确保应用程序始终是最新的,即使停止时间内的通知未被接收/忽略。
因此, application:didReceiveRemoteNotification:
意味着不传输数据和更新模型,而是对事件做出反应并启动必要的程序。虽然大多数情况下,数据可能非常小,以至于它适合通知,因此应用程序可以在不下载任何其他内容的情况下继续进行。