2012-09-05 37 views
5

我有一个iOS 5.1应用程序,它向APNS服务注册以接收通知。该注册成功,我收到正确的通知。我尝试处理通知时出现问题。如何处理iOS中的未读推送通知?

一旦应用程序正在运行,AppDelegate中的方法didReceiveRemoteNotification被正确调用,因此按照预期处理通知。但是,这仅在应用程序在前台运行时发生。

但是,当应用程序在后台运行或简单停止时,该方法不会被调用。我读过你应该添加一些方法didFinishLaunchingWithOptions方法来获得来自userInfo字典的通知,并处理它。这可以正常工作,但只有在通知中心点击通知后才能打开应用程序。这意味着,如果您通过点击徽章打开应用程序,或者只是在后台运行时更改上下文,则应用程序从未意识到收到通知。此外,如果收到多个通知,我们可以只能通过点击通知中心来处理其中的一个,这很痛苦:-)

有没有什么方法可以读取通知中心的未决通知?我知道有一种方法可以使用方法cancelAllLocalNotifications来刷新它们,但我还没有找到一种方法来阅读它们。我真的需要处理所有这些问题。我想在第三方通知服务器上实现通信协议,以便在应用程序进入前台时再次检索信息,但由于信息已经在操作系统中,因此如果无法以某种方式访问​​它,我会发现它很奇怪。

那么,有没有人知道一个办法呢?提前致谢。

回答

3

当推送通知到达并且用户单击'取消'时,您的应用程序无法再次读取推送通知。您必须实现一个单独的功能(最可能在服务器端)来获取发送到此设备的通知列表。

例如,如果您的应用中提供了聊天功能,并且您通过推送通知发送了聊天消息,那么您还应该在服务器上保留聊天消息。如果用户在任何推送通知上单击“取消”,则该聊天消息将不会显示在iOS设备上。在这种情况下,当应用程序稍后进入前台时,您可以拨打服务器的电话并获取所有以前的聊天消息(通过推送通知发送)。

+0

可以肯定的是推送通知不能保证到达。也许我在浪费时间试图从notifiaction服务中读取它们,因为我不能确定它包含了我想要的所有信息。无论如何,我需要知道在丢弃任何解决方案之前是否有办法这样做...... – Bartserk

+0

您的答案是正确的。据我所知,除了从服务器端获取外,没有其他解决方案。 –

1

好吧,所以一个可能的解决方案是将另一个数据库表中的消息与'读'标志和messageID字段?默认情况下,读取标志为NO,那么当应用程序成功读取并显示时,它将标志更新为YES?

只有256个字节可以使用,需要什么样的ID字段长度?

编辑,

执行此计划及其成功工作。

+0

是的,这是一个很好的解决方案:)你也可以将这个消息与一个“用户”表关联起来,这样你就可以构建一个聚合值来检查用户有多少条未读消息。而且,使用这个价值,你可以安全地更新子弹,这是我写这个问题时的主要关注点。至于ID,一个很好的32位数字值应该是足够的,除非你正在处理大量的信息:) – Bartserk

+0

我没有去使用应用程序令牌和消息ID作为比较消息的方式,这意味着我可以只需使用一个简短的ID,并且令牌应该足以停止冲突。 –

+0

我不得不说,在文档中强烈建议不要使用应用程序的标记作为id。尽管它或多或少起作用,但应用程序令牌比iOS中更加不稳定。例如,它可能会因操作系统更新或工厂重置而发生变化。你应该考虑生成一些其他类型的设备相关的ID。 – Bartserk