【问题标题】:How to count push notifications APN如何计算推送通知 APN
【发布时间】:2018-01-29 12:10:58
【问题描述】:

在服务器端,发送苹果推送通知的nodejs平台使用node-apn

这是一个带有徽章的示例 - 这是推送的次数。

 const apn = require("apn");

let tokens = ["<insert token here>", "<insert token here>"];

let service = new apn.Provider({ 
  cert: "certificates/cert.pem",
  key: "certificates/key.pem",
});

let note = new apn.Notification({
  alert:  "Breaking News: I just sent my first Push Notification",
  badge: countSendedPushes()
});

note.topic = "<bundle identifier>";

 service.send(note, tokens).then( result => {
   console.log("sent:", result.sent.length);
   console.log("failed:", result.failed.length);
   console.log(result.failed);
 });

事实上,每次我发送推送并在我的数据库中增加 badge + 1

当在设备上读取推送时,我减一 徽章 - 1

每次发送新推送时,总是发送当前数量的徽章 但是如果设备离线则无法推送,但数据库中的数字已经增加了。

我怎样才能更正计数徽章

【问题讨论】:

    标签: apple-push-notifications apn node-apn


    【解决方案1】:

    如果它成为一个问题,那么也许您不应该乐观地更新数据库?看起来你的推送代码返回了一个 Promise,所以那里有一个自然的流程,例如

    service.send(...)
       .then(result => {
           // update badge count in DB
       });
    

    或者,如果您需要乐观地更新,则可以在推送失败时减少计数

    service.send(...)
       .then(result => {
          if (result.failed.length) {
             // decrement badge count in DB
          }
       });
    

    我要说的是,您确定当推送通知失败时,APNS 不会尝试代表您重新发送? IIRC APNS 将在最终失败之前继续尝试提供 X 周期的推送 - 值得确保失败是 true 失败,因为它以后不会重试。


    根据 cmets 中的讨论,我认为问题实际上更多是关于不确定设备是否已收到推送通知,而不是知道服务器是否已成功发送它 -然而,这确实回到了我原来的观点,也许你在这里过于乐观了。

    推送通知采用“即发即弃”类型的架构,APNS 不保证您的消息将被传送到设备,也没有关于它是否存在的反馈。最终,了解设备收到消息的唯一可靠方法是设备本身告诉您。

    这样做的一种方法是在推送通知中添加一些额外的数据,例如一个 UUID,服务器可以生成它来表示消息握手的开始。在您的移动应用程序中,收到推送通知后,它可以通过关联 ID 告诉服务器它收到消息来完成握手。自然地,你会从拥有一个单一的“计数”字段的概念转向一个完全成熟的表格,例如

    MessageID | DeviceToken | SentOn | ReceivedOn
    

    这样的事情不仅可以为您提供所需的计数,还可以为您提供审计跟踪,我认为这对于确定发送与接收、有问题的设备等统计数据非常有用。

    【讨论】:

    • 问题最严重,推送失败很容易,我处理失败推送。但是如果推送成功,我不知道设备是离线模式还是在线......
    • APN 不保证成功传送到设备
    • @modelfak 所以你在这里谈论两件不同的事情,你的应用程序成功地推送通知,但是你要求一种方法来确定设备收到我>他们。我会说这真的是移动应用程序更新的更多责任,不是吗?例如,当您发送一封信时,您永远不会知道它到达目的地的确切日期/时间,您知道的唯一方法是该人何时签名(或者您是否跟随邮递员!)。跨度>
    • 好的,如果推送已交付,您是否建议从设备发送到服务器请求?
    猜你喜欢
    • 2014-04-23
    • 2018-12-05
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2018-06-21
    相关资源
    最近更新 更多