5

Push Sharpライブラリを使用して、Apple APN サーバーにプッシュ通知を送信しています。コードはうまく機能し、何千もの通知を送信できます。

問題は、無効なデバイス トークンで通知を送信しようとすると、プッシュ シャープ フレームワークから失敗メッセージを受け取り、pushsharp.apple.notificationfailureexceptionその時点以降にキューに入れられたすべてのメッセージが送信されないことです。基本的に、1 つの通知が失敗すると、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);
4

1 に答える 1

1

Ok。this answerthis answerが役立つようです。

あなたと同じように、無効なデバイス トークンを持っていると OnNotificationFailed イベントが発生し、その後の通知もすべて失敗することがテストでわかりました。

簡単に言えば、Apple が無効なデバイス トークンで接続を静かにドロップし、その後のすべてが失敗するようです (同じエラー)。

すべてが失われるわけではありません。OnNotificationFailed のイベント ハンドラーでは、渡された通知の内容をチェックして、失敗した通知を確認できます。

次の論理的なステップは、同じ通知を再送信して、それらを個別にウォークすることです。次に、2 回目の失敗を将来の通知から無効として除外するか、成功したものを良好としてマークします。

于 2016-11-05T04:53:32.077 に答える