如何知道推送通知传递状态

Sal*_*lim 17 iphone objective-c push-notification ios

我在应用程序中使用推送通知.一切都很顺利.

有时从服务器发送的消息,但在应用程序端,它没有收到.

在这种情况下,我必须知道哪些消息丢失(app没有收到).

有没有办法从服务器端知道哪些消息是由app收到的,哪些不是?

sta*_*Man 27

没有,推送通知是一次又一次的冒险.

Apple不会告诉您以下内容:

  1. 无法判断消息是否已成功发送
  2. 不会告诉用户是否已选择退出推送通知
  3. 还有很多其他的东西,不管怎样

然而

另一方面,当用户选择推送通知时,您的应用可以在一定程度上处理此问题:

基本上,您可以在服务器中添加逻辑-didReceiveRemoteNotification:-didFinishLaunchingWithOptions:与服务器联系,并告诉服务器已收到消息.
如果在特定时间段内未收到,则可以重新发送.

但正如您所看到的,这可能会导致使用相同的推送通知充斥无辜用户的可能情况.
在某种意义上,骚扰他点击你的愚蠢推送通知,这反过来可能导致他完全关闭你的应用程序的推送通知,但大多数情况下他会删除该应用程序甚至可能给它一个低评级?
我会说,为你服务吧.

无论如何,如果你继续这样做,你需要实现一个识别模式,你可以message identifier在推送通知的有效载荷中插入一个唯一的,当你的应用获得这个推送通知时,它应该将它发送message identifier回服务器.
然后,您的服务器应记录特定设备令牌返回的内容message identifier,这意味着它收到了特定的推送通知.

您的服务器可以每小时/每天/不论来检查,并将特定消息重新发送给那些未向亲属报告的设备令牌message identifier.

同样,这意味着您的服务器有时可能需要工作OT.


整个方法还有其他问题:

  1. 用户收到了推送通知但是将其取消而不是用它打开你的应用程序
    • 您的服务器将假定用户没有看到推送通知,并将再次发送此推送通知
  2. 鬼设备令牌
    • 用户首先接受了推送通知,但后来撤销了此权限
    • 用户卸载了该应用程序
    • 基本上,设备令牌曾经用于接收推送通知但不再使用,很可能是由于您的消息泛滥声誉
  3. 用户收到推送通知,但稍后会点击它
    • 可能会多次获得相同的推送通知(非常恼人)
  4. 用户收到推送通知,但在没有互联网连接时点击它
  5. 用户收到推送通知,但您的服务器已关闭,可能是炒\ m /

您可以通过在应用程序中使用更多逻辑来绕过最后3个场景,这些逻辑将要发送到服务器的消息ID排队,并仅在服务器成功响应时将其删除.

所以你看,太多的工作,服务器端+客户端.
此外,在处理大量用户时,服务器端的性能会大幅下降,同时还会降低应用程序的性能.


med*_*eda 6

反馈服务

Apple推送通知服务包含一个反馈服务,可为您提供有关失败推送通知的信息.如果由于设备上不存在预期的应用程序而无法发送推送通知,则反馈服务会将该设备的令牌添加到其列表中.在传递之前过期的推送通知不被视为传递失败,并且不会影响反馈服务.通过使用此信息来停止发送无法传递的推送通知,可以减少不必要的消息开销并提高整体系统性能.

每天查询反馈服务以获取设备令牌列表.使用时间戳来验证自生成反馈条目以来尚未重新注册设备令牌.对于尚未重新注册的每个设备,请停止发送通知.APN监控提供商在检查反馈服务方面的努力,并避免向设备上不存在的应用程序发送推送通知.