每次推送通知都不会调用didReceiveRemoteNotification

时间:2013-10-29 15:42:33

标签: ios objective-c push-notification apple-push-notifications

似乎如果我向同一设备发送多个推送通知,同时,每次发送的通知都不会调用didReceiveRemoteNotification。假设我发送了6个通知,didReceiveRemoteNotification平均只被调用3次。那就是应用程序当前正在运行。但如果我在应用程序之外并发送6个推送通知,则所有通知将被发送到通知中心/锁定屏幕。这是预期的行为吗?

1 个答案:

答案 0 :(得分:4)

这是预期的行为:

  

Apple推送通知服务包括默认的服务质量   执行存储转发功能的(QoS)组件。

     

如果APN尝试发送通知但设备处于离线状态,   通知存储一段有限的时间,并交付   设备何时可用。

     

仅存储特定应用程序的最近通知。   如果在设备离线时发送了多个通知,则各自   新通知会导致先前通知被丢弃。这个   仅保留最新通知的行为称为   合并通知。

     

如果设备长时间处于离线状态,则会发出任何通知   被存放,因为它被丢弃。

虽然在您的情况下设备处于联机状态,但需要注意的重要事项是,APN仅为每个设备存储一个应用通知。假设您一次发送3个通知。当第二条消息到达时,APN服务器正在向设备发送第一条消息。它存储第二条消息。然后第三条消息到达而第一条消息仍然被传递,因此第三条消息会覆盖第二条消息,第二条消息永远不会传递。

这里有另一个引用,你可能会发现更有说服力:

  

收到了一些通知,但并非全部

     

如果要向同一设备发送多个通知或   计算机在短时间内,推送服务将发送   只有最后一个。

     

这就是原因。设备或计算机确认收到每个   通知。直到推送服务收到该确认,它   只能假设设备或计算机已脱机   理由并将通知存储在服务质量(QoS)中   排队等待将来重新开始。这里的往返网络延迟是   当然是一个主要因素。

     

如本地和推送通知编程指南中所述   QoS队列为每个设备或计算机的每个应用程序保留一个通知。   如果服务在收到通知之前收到另一个通知   队列被发送,新通知将覆盖前一个通知。

     

所有这些都指出意图是通知   向应用程序表明感兴趣的内容已经发生了变化   提供商,应用程序应该与提供商签入以获取   细节。通知不应包含不同的数据   可以在其他地方找到,也不应该是有状态的。

     

任何未立即发送的推送通知都已排队等候   未来的重新发送,因为您的设备未连接到   服务。 “立即”当然需要为你的延迟   连接考虑在内。边远案件将超过60秒   APN将在那时超时。

Source