0

XMPP サーバーとして ejabberd を使用して、Android 用のチャット アプリケーションを開発しています。ユーザーがオフラインのときに GCM プッシュ通知を送信したい。そのために、ejabberd で新しいモジュールを作成し、offline_message_hook を登録していますが、この関数は、誰かが入力を開始して終了したときにのみ呼び出されます。以下は、このフックに渡される唯一のパケットです。ただし、ユーザーはオンラインになるとメッセージを受け取ります。

Packet: {xmlelement,
      "message",
      [{"type",
       "chat"},
      {"id",
       "purple7d4d0773"},
      {"to",
       "xxx@rakshith"}],
      [{xmlelement,
       "paused",
       [{"xmlns",
         "http://jabber.org/protocol/chatstates"}],
       []}]}
Packet: {xmlelement,
      "message",
      [{"type",
       "chat"},
      {"id",
       "purple7d4d0773"},
      {"to",
       "xxx@rakshith"}],
      [{xmlelement,
       "composing",
       [{"xmlns",
         "http://jabber.org/protocol/chatstates"}],
       []}]}
4

1 に答える 1

5

ejabberd のフックに関する 2 つの点: 1) コールバックは常に順番に呼び出されます。順番は、登録時に指定した優先度によって定義されます。2) コールバックが 'stop' を返す場合、イベントがチェーン上の残りのリスナーに伝播されるのを防ぎます。

何が起こっているかというと、コードと同じように、ejabberd オフライン モジュールが offline_message_hook でリッスンしているということです。メッセージを処理し、'stop' を返すため、コードは実行されません。

(あなたのコードは、chatstates 通知のメッセージを受け取ります。なぜなら、これらはオフライン モジュールによって無視されるためです。その場合、チェーンは停止しません)。

おそらく 、オフライン ストレージ モジュールの前にコードを実行する必要があります。'stop' を返さないことを忘れないでください。これにより、オフライン モジュールはメッセージを保存する機会を得ることができます。

于 2013-03-01T04:08:47.070 に答える