在服务器端,用于发送 Apple推送通知的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);
});
事实上,每次我发送推送并在数据库中增加徽章 + 1
当在设备上读取推送时,我减去一个徽章 - 1
每次发送新推文时,我总会发送当前数量的徽章 但是,如果设备处于脱机状态,则无法推送,但数据库中的数字已经增加。
如何纠正计数徽章?
答案 0 :(得分:0)
如果它成为一个问题,那么也许你不应该乐观地更新数据库?看起来您的推送代码返回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期间的推动 - 值得确保失败是真正的失败,因为它不会在以后再次重试。
根据评论中的讨论,我发现问题实际上更多的是不确定设备是否已收到推送通知而不是知道服务器是否已成功发送 - 然而,这确实回到了我原来的观点,也许你的太乐观了。
推送通知的工作原理是“即发即忘”类型的架构,APNS没有保证您的消息将被传送到设备,并且没有关于它是否存在的反馈。最终,了解设备的唯一可靠方式获取消息是设备本身告诉您的。
执行此操作的一种方法是在推送通知中添加一些其他数据,例如一个UUID,服务器可以生成该UUID来表示消息握手的开始。在您的移动应用程序中,收到推送通知后,它可以通过关联ID来告知服务器收到消息,从而完成握手。当然,你已经摆脱了单一“计数”字段和完全成熟的表格的概念,例如
MessageID | DeviceToken | SentOn | ReceivedOn
这样的事情不仅可以为您提供所需的计数,还可以为您提供审计跟踪,我认为这对于确定发送与收到,有问题的设备等统计数据非常有用。