Как считать 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

Нечто подобное может не только дать вам необходимое количество, но и дать вам контрольный журнал, который, я думаю, окажется очень полезным для определения статистики, такой как отправленные и полученные, проблемные устройства и т. Д.

Другие вопросы по тегам