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

我在应用程序中使用推送通知。 一切都很好。

有时从服务器发送消息,但在应用程序方面,它没有收到。

在这种情况下,我必须知道哪些邮件丢失交付(应用程序没有收到)。

有什么办法从服务器端知道哪些消息是由应用程序接收,哪些不是?

不,推送通知是不可思议的。

苹果不会告诉你以下内容:

  1. 不会告诉消息是否成功发送
  2. 不会告诉用户是否select了推送通知
  3. 很多其他东西,但无论如何…

然而

另一方面,当用户select推送通知时,你的应用程序可以处理这个,但在一定程度上:

基本上,您可以在-didReceiveRemoteNotification:-didFinishLaunchingWithOptions:添加逻辑-didFinishLaunchingWithOptions:联系您的服务器,并告诉您的服务器收到了该消息。
如果在特定的时间段内没有收到,则可以重新发送。

但是,正如你所看到的, 这可能会导致一个可能的情况,用相同的推送通知淹没一个无辜的用户。
在某种意义上,骚扰他挖掘你愚蠢的推送通知,这反过来可能会导致closures推送通知为您的应用程序完全,但主要是泽将删除应用程序,甚至可能会给它一个低评价?
为您服务,我会说。

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

您的服务器可以每小时/每天/无论什么情况下进行检查,并将特定消息重新发送给那些尚未用相关message identifier报告的设备令牌。

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


整个方法还有其他的问题:

  1. 用户收到推送通知,但驳回它,而不是打开你的应用程序
    • 您的服务器将假定用户没有看到推送通知,并将再次发送此推送通知
  2. 鬼装置令牌
    • 起初用户接受了推送通知,但后来撤销了这个提示
    • 用户卸载了该应用程序
    • 基本上,设备令牌曾经用来接收推送通知,但不再做,很可能是由于您的消息泛滥的声誉
  3. 用户收到推送通知,但稍后再点击
    • 可能会多次获得相同的推送通知( 非常刺激
  4. 用户收到推送通知,但在没有互联网连接时点击
  5. 用户收到推送通知,但您的服务器已closures,可能炒\ m /

您可以绕过最后3个场景,在您的应用程序中有更多的逻辑将队列发送到服务器的消息ID排除,只有当服务器成功响应时才会将其删除。

所以你看,工作太多,服务器端+客户端。
另外,在处理大量用户时,服务器端性能会大大降低,同时应用性能也会下降一点。

1.如果您询问未在设备上安装应用程序的设备上发送的通知,以及由于通知在交付之前已过期或其他原因,通知不会传递给您。

那么答案是

不。

它不提供支持,您可以检查通知是否已过期,而不是在有效的设备上交付:

任何知道苹果应用程序获取推送通知的选项?

在上面的链接参考Moshe的答案。 我在这里包括他的答案,这样即使万一链路死了,它对未来的每个人都是有用的。

简短的答案,你不能,因为APNS是一种方式。 但是,由于应用程序可以在接收到通知时执行任意代码,因此您可以使用这种方式说,在收到通知时向您自己的服务器发送http请求。

2.如果您询问因为用户卸载了应用程序而未能提供的通知,那么您可以在这篇文章中参考meda的回答。

希望这可以帮助你,让我知道如果你有任何疑问我的解释。

反馈服务

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

每天查询反馈服务以获取设备令牌列表。 使用时间戳validation设备令牌自从生成反馈条目以来没有被重新注册。 对于每个尚未重新注册的设备,请停止发送通知。 APN监视提供商勤勉地检查反馈服务,并避免将推送通知发送到设备上不存在的应用程序。