0

皆さん、私は最近nodejsをサードパーティのAPNサーバーとして使用しようとしており、node-apnモジュール( https://github.com/argon/node-apn )を使用しています。同じ通知 (つまり、同じアラート) を短時間 (5 分間で 5 つの通知など) にプッシュすると、Apple の APN サーバーが私の通知を「キャッシュ」したように見えることがわかりました。通常どおり別のメッセージをプッシュすると (メッセージ 5 分などの通常の速度で)、「キャッシュされた」メッセージがデバイスに何度も届きます。

node-apn モジュールのコードを少し掘り下げたところ、Apple への TLS(SSL) が作成され、ストリーム データ (nodejs のバッファ) が Apple のサーバーに送信されることがわかりました。すべて問題ないようです。 、しかし、メッセージは複製されただけです(短時間でプッシュした場合)。また、Python の lib APNSWrapper( https://code.google.com/p/apns-python-wrapper ) も試してみます。コードは同じことを行うだけで、問題は発生しません。

彼らがアップルのサーバーに送信するものは、次のようにまったく同じです。

[command, token.length, token.content, payload.length, payload.content]

command、token.length、payload.length は 2 バイトの unsigned int ですbig-endian。python lib は format!HB32s58sでストリーム全体を構築します。32 と 58 は単なる長さです。! はビッグエンディアン、H は unsigned char(1 バイト)、B は unsigned int(2 バイト) を意味します。32s は 32 バイトの文字列を意味し、58 は 58 バイトの文字列を意味します。

そして、nodejs tls 接続は同じことを行っているだけです。すべての長さは で書かれていcleartextStream.writeUInt16BE()ます。ここでの BE はビッグエンディアンを意味します。

私はバイトごとにテストして、送信するものがまったく同じであることを確認しました。メッセージを受信するためにSSLサーバーを作成し、同じデータを受信しました(バイトごとにチェックしました)。したがって、アップルのサーバーが受信したものはまったく同じである必要があります。しかし、彼らは異なる行動をとっているだけです。私はここで何か提案を待っています、事前に感謝します!

4

1 に答える 1

0

2 回送信しないようにするには、次のことを試してください。

apnConnection.on('transmitted', function(notification, device) {
  console.log("Notification transmitted to:" + device.token.toString('hex'));
});
于 2014-10-29T08:54:06.077 に答える