0

我正在开发使用 ejabberd 作为 XMPP 服务器的 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 中的钩子的两件事: 1) 回调总是按顺序调用,顺序由您在注册时指定的优先级定义。2) 如果回调返回“停止”,它会阻止事件传播到链上的其余侦听器。

正在发生的事情是 ejabberd 离线模块正在侦听 offline_message_hook,这与您的代码相同。它处理消息并返回“停止”,因此您的代码不会被执行。

(您的代码确实收到了聊天状态通知的消息,因为这些消息被离线模块忽略,因此在这些情况下它不会停止链)。

您可能希望您的代码 在离线存储模块之前运行。请记住不要返回“停止”,以便离线模块有机会存储消息。

于 2013-03-01T04:08:47.070 回答