Как считать push-уведомления APN
На стороне сервера платформа nodejs для отправки push-уведомлений Apple использует 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);
});
Фактически, каждый раз, когда я отправляю push и увеличиваю свой значок базы данных + 1
Когда на устройстве считывается push, я уменьшаю минус один значок - 1
Каждый раз, когда я отправляю новый push, я всегда отправляю текущее количество значков. Но если устройство находится в автономном режиме, оно не может нажимать, но число в базе данных уже увеличивается.
Как я могу исправить количество значков?
1 ответ
Если это становится проблемой, то, возможно, вам не следует оптимистично обновлять базу данных? Похоже, ваш push-код возвращает Promise, поэтому там есть естественный поток, например
service.send(...)
.then(result => {
// update badge count in DB
});
В качестве альтернативы, если вам нужно обновлять с оптимизмом, вы можете просто уменьшить счетчик, если пуш произойдет неудачно
service.send(...)
.then(result => {
if (result.failed.length) {
// decrement badge count in DB
}
});
Единственное, что я скажу: вы уверены, что при сбое push-уведомления APNS не будет пытаться отправить сообщение от вашего имени? IIRC APNS будет продолжать пытаться доставить пуш в течение периода X, прежде чем в конечном итоге потерпит неудачу - стоит удостовериться, что сбой является истинной ошибкой, поскольку он не будет повторяться позже.
Основываясь на обсуждении в комментариях, я вижу, что проблема на самом деле заключается в том, чтобы не знать наверняка, что устройство получило push-уведомление, а не знать, успешно ли сервер его отправил - однако это возвращает к моей первоначальной точке. возможно, вы слишком оптимистичны здесь.
Push-уведомления работают на основе архитектуры типа "запусти и забудь", от APNS нет гарантии, что ваше сообщение будет доставлено на устройство, и нет отзывов о том, было оно или нет. В конечном счете, единственный надежный способ узнать, что устройство получило сообщение, - само устройство сообщит вам.
Один из способов сделать это - добавить некоторые дополнительные данные к вашему push-уведомлению, например, UUID, который сервер может сгенерировать для представления начала рукопожатия сообщения. В вашем мобильном приложении после получения push-уведомления оно может завершить рукопожатие, сообщив серверу, что оно получило сообщение, сопоставив идентификатор. Естественно, вы бы отошли от понятия наличия единого поля "count" и обратились к полноценной таблице, например
MessageID | DeviceToken | SentOn | ReceivedOn
Нечто подобное может не только дать вам необходимое количество, но и дать вам контрольный журнал, который, я думаю, окажется очень полезным для определения статистики, такой как отправленные и полученные, проблемные устройства и т. Д.