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

Mob*_*Mon 5 objective-c push-notification apple-push-notifications ios

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

Era*_*ran 4

这是预期的行为:

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

如果 APN 尝试传送通知但设备处于离线状态,则通知会存储一段有限的时间,并在通知可用时传送到设备。

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

如果设备长时间保持离线状态,则为其存储的任何通知都会被丢弃。

在您的情况下,设备处于在线状态,需要注意的重要一点是,APN 只会为每台设备的应用程序存储一个通知。假设您一次发送 3 个通知。当第二条消息到达时,APN 服务器正在将第一条消息传送到设备。它存储第二条消息。然后,当第一条消息仍在传递时,第三条消息到达,因此第三条消息会覆盖第二条消息,并且第二条消息永远不会传递。

这是您可能会发现更有说服力的另一句话:

收到一些通知,但不是全部

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

原因如下。设备或计算机确认收到每个通知。在推送服务收到该确认之前,它只能假设设备或计算机由于某种原因已离线,并将通知存储在服务质量 (QoS) 队列中以供将来重新传递。这里的往返网络延迟当然是一个主要因素。

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

所有这些都表明,通知的目的是向应用程序指示提供程序上感兴趣的某些内容发生了更改,并且应用程序应与提供程序联系以获取详细信息。通知不应包含在其他地方无法获得的数据,并且它们也不应该是有状态的。

由于您的设备未连接到该服务,任何未立即发送的推送通知都会排队等待将来重新发送。“立即”当然需要考虑连接的延迟。外围案例将超过 60 秒,因为 APN 届时将超时。

来源