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

时间:2014-09-14 06:13:12

标签: ios objective-c iphone push-notification

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

有时从服务器发送消息但在应用程序端发送的消息不会收到。

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

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

4 个答案:

答案 0 :(得分:26)

Nopes,推送通知即刻即发。

Apple不会告诉您以下内容:

  1. 无法判断消息是否已成功发送
  2. 无法判断用户是否已选择退出推送通知
  3. 很多其他事情,但无论如何......

  4. 然而

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

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

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

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

    您的服务器可以按小时/每日/不同的方式检查,并将特定邮件重新发送给尚未使用相对message identifier报告的设备令牌。

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


    整个方法还有其他问题:

    1. 用户收到了推送通知但却驳回了通知,而不是用它打开您的应用
      • 您的服务器将假定用户未看到推送通知,并将再次发送此推送通知
    2. Ghost设备令牌
      • 用户首先接受了推送通知,但后来撤销了此权限
      • 用户已卸载应用
      • 基本上,曾经用于接收推送通知但不再使用的设备令牌,很可能是由于您的消息泛滥声誉
    3. 用户收到了推送通知,但稍后会点击它
      • 可能多次获得相同的推送通知(非常恼人
    4. 用户收到推送通知,但在没有互联网连接时点按
    5. 用户收到推送通知,但您的服务器已关闭,可能是炒\ m /
    6. 您可以通过在应用程序中使用更多逻辑来绕过最后3个场景,这些逻辑将要发送到服务器的消息ID排队,并仅在服务器成功响应时将其删除。

      所以你看,太多工作,服务器端+客户端。
      此外,在与大量用户打交道时,服务器端的性能会大幅降低,同时还会降低应用程序的性能。

答案 1 :(得分:5)

<强> The Feedback Service

  

Apple推送通知服务包括反馈服务   为您提供有关失败推送通知的信息。当推   无法发送通知,因为预期的应用程序没有   在设备上存在,反馈服务将该设备的令牌添加到   它的清单。在传递之前过期的推送通知   不被视为交付失败,不会影响反馈   服务。通过使用此信息停止发送推送通知   这将无法交付,您减少不必要的消息   开销并提高整体系统性能。

     

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

答案 2 :(得分:3)

1。如果您询问的是在设备上安装了应用程序的设备上未提供的通知,并且仅仅是因为通知在交付之前已过期或其他原因,则无法通知通知。

然后答案是

不。

它不提供支持,您可以检查通知是否已过期但未在有效设备上发送:

any option to know if apple app get the push notification?

请参阅上面链接中的Moshe的回答。我在这里包括他的答案,以便将来对每个人都有用,即使链接已经死了。

  

简短的回答,你不能,因为APNS是单向的。但是,自从   应用程序可以在收到通知后执行任意代码,您可以   用这个来说,当你的服务器发送一个http请求   收到通知。

2. 如果您在用户已卸载应用程序时询问未发送的通知,则可以参阅此帖子中的 meda 答案。

希望这可以帮助您,如果您对我的解释有任何疑问,请告诉我。

答案 3 :(得分:0)

您可以使用&#34;服务扩展程序&#34;来获取推送通知的发送报告,而不是来自服务器,而是来自您的应用。并在Push json中修改一点点。结帐this link了解详细说明。