我在应用程序中使用推送通知。一切顺利。
有时消息从服务器发送,但在应用端却收不到。
在这种情况下,我必须知道缺少要传递的消息(应用未收到)。
有什么方法可以从服务器端知道哪些消息被应用程序接收到哪些没有?
最佳答案
不,推送通知是即发即弃的。
Apple 不会告诉您以下内容:
- 不会判断消息是否发送成功
- 不会告知用户是否已选择退出推送通知
- 还有许多其他事情,但无论如何...
然而
另一方面,当用户选择了推送通知时,您的应用可以在一定程度上处理此问题:
基本上,您可以在 -didReceiveRemoteNotification:
和 -didFinishLaunchingWithOptions:
中添加逻辑以联系您的服务器并告知您的服务器已收到消息。
如果在特定时间段内未收到,您可以重新发送。
但如您所见,这可能会导致无辜用户被相同的推送通知淹没。
从某种意义上说,骚扰他点击你愚蠢的推送通知,这反过来可能会导致他完全关闭你应用程序的推送通知,但大多数情况下他会删除应用程序,甚至可能给它一个低评级?
为你服务,我会说。
无论如何,如果你继续这样做,你将需要实现一个识别模式,你将一个唯一的消息标识符
插入到推送通知的有效负载中,当你的应用程序收到这个推送通知时,它应该将此消息标识符
发送回服务器。
然后,您的服务器应该记录一个特定的设备 token 返回了一个消息标识符
,这意味着它收到了那个特定的推送通知。
您的服务器可以每小时/每天/任何时间进行检查,并向那些未使用相关消息标识符
报告的设备 token 重新发送特定消息。
同样,这意味着您的服务器有时可能需要加类。
整个方法还有其他问题:
- 用户收到推送通知但将其关闭而不是用它打开您的应用
- 您的服务器会假定用户没有看到推送通知,并会再次发送此推送通知
- 幽灵设备 token
- 用户起初接受推送通知,但后来撤销了此权限
- 用户卸载了应用
- 基本上,曾经用于接收推送通知但不再接收推送通知的设备 token 很可能是由于您的消息泛滥声誉所致
- 用户收到推送通知但稍后点击它
- 可能会多次收到相同的推送通知(非常烦人)
- 用户收到推送通知,但在没有互联网连接时点按它
- 用户收到推送通知,但您的服务器已关闭,可能是炸了\m/
您可以通过在您的应用程序中加入更多逻辑来规避最后 3 种情况,这些逻辑将要发送到服务器的消息 ID 排队,并仅在服务器成功响应时将其删除。
所以你看,太多的工作,服务器端+客户端。
此外,在处理大量用户时,它会严重降低服务器端的性能,并且会稍微降低应用程序的性能。
关于ios - 如何知道推送通知发送状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25830597/