Когда одно сообщение PushSharp выходит из строя, все они терпят неудачу

Я использую библиотеку Push Sharp для отправки push-уведомлений на сервер Apple APN. Код работает отлично, я могу отправлять тысячи уведомлений.

Проблема в том, что если я пытаюсь отправить уведомление с недопустимым токеном устройства, я получаю сообщение об ошибке от платформы push sharp pushsharp.apple.notificationfailureexception, и каждое сообщение, помещенное в очередь после этого момента, не отправляется. По сути, PushSharp очищает свою очередь, если одно уведомление не удается.

Например, если я поставил в очередь 4 уведомления (1,2,3,4) и уведомление 2 имеет недопустимый токен устройства, уведомление 1 будет отправлено, 2 не будет выполнено, а 3 и 4 не будут отправлены (и не будет запущено событие, информирующее этого).

Я понимаю, что уведомление с недействительным токеном устройства не будет отправлено, но не допускается отбрасывать другие N уведомлений в очереди.

Есть ли обходные пути для этого?

Вот мой код:

_appleSettings = new ApplePushChannelSettings(!NOTIFICATION_SERVICE_USE_DEVELOPMENT,
     NOTIFICATION_SERVICE_USE_DEVELOPMENT 
     ? SSL_CERTIFICATE_NAME_DEV : SSL_CERTIFICATE_NAME_PROD, 
     SSL_CERTIFICATE_PASSWORD);

_appleSettings.ConnectionTimeout = NOTIFICATION_SERVICE_CONNECTION_TIMEOUT;
_appleSettings.FeedbackIntervalMinutes = 0; /*WE WILL HANDLE THE FEEDBACK EXTERNALLY*/
_appleSettings.MaxConnectionAttempts = NOTIFICATION_SERVICE_RETRY_ATTEMPS;

_serviceSettings = new PushServiceSettings();
_serviceSettings.MaxAutoScaleChannels = NOTIFICATION_SERVICE_NUM_CONNECTIONS;

_pushBroker = new PushBroker();
_pushBroker.OnChannelCreated += _pushBroker_OnChannelCreated;
_pushBroker.OnChannelDestroyed += _pushBroker_OnChannelDestroyed;
_pushBroker.OnChannelException += _pushBroker_OnChannelException;
_pushBroker.OnDeviceSubscriptionChanged += _pushBroker_OnDeviceSubscriptionChanged;
_pushBroker.OnDeviceSubscriptionExpired += _pushBroker_OnDeviceSubscriptionExpired;
_pushBroker.OnNotificationFailed += _pushBroker_OnNotificationFailed;
_pushBroker.OnNotificationRequeue += _pushBroker_OnNotificationRequeue;
_pushBroker.OnNotificationSent += _pushBroker_OnNotificationSent;
_pushBroker.OnServiceException += _pushBroker_OnServiceException;


//now add those settings to the push broker
_pushBroker.RegisterAppleService(_appleSettings, _serviceSettings);


notification = new AppleNotification(notificationMessage.DeviceExtContext);
notification.Payload.Alert.Body = notificationMessage.Message;
notification.Payload.Sound = NOTIFICATION_SOUND;
// notification.Payload.Badge = 1;
notification.Tag = notificationMessage;

//attempt to queue the notification
_pushBroker.QueueNotification(notification);

person user3335999    schedule 16.05.2014    source источник
comment
У нас такая же проблема. Мы отправили пакет из 10 или около того уведомлений в очереди и вызвали StopAllServices. Затем мы перераспределяем нового PushBroker. Таким образом, ущерб ограничивается потерей только нескольких уведомлений. Возможно, нам придется отказаться от PushSharp и рассмотреть альтернативы именно для этих типов проблем.   -  person Rudy    schedule 27.05.2014


Ответы (1)


В порядке. этот ответ и этот ответ похоже помогает.

Как и вы, в ходе тестирования я обнаружил, что я получаю событие OnNotificationFailed, когда у меня есть недействительный токен устройства, и что каждое последующее уведомление также будет терпеть неудачу.

Вкратце, кажется, что Apple молча разрывает соединение на недействительном токене устройства, а затем все последующее терпит неудачу (та же ошибка).

Еще не все потеряно. В обработчике событий для OnNotificationFailed вы можете проверить содержимое переданного уведомления, чтобы увидеть, какие из них не сработали.

Следующим логическим шагом было бы пройти их по отдельности, повторно отправив одно и то же уведомление. Затем отсекая те, которые получили второй сбой, как недействительные из будущих уведомлений и / или отмечая успешные как хорошие.

person BIBD    schedule 05.11.2016