在 XMPP 中获取离线消息

Posted

技术标签:

【中文标题】在 XMPP 中获取离线消息【英文标题】:Get Offline messages in XMPP 【发布时间】:2012-11-02 11:23:13 【问题描述】:

在我的聊天应用程序中,我想在用户登录时获取离线消息(如果有人向他发送消息)。当用户处于在线状态并且在用户重新登录后无法获取消息时,我会收到通知。我也检查了 xmpp 日志猫。我可以在那里阅读离线消息,但我无法通知用户他/她的离线消息。

这是我在服务的 onStart 中使用的监听器(服务在用户登录时立即启动)

PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        final PacketCollector collector = connection.createPacketCollector(filter);
        connection.addPacketListener(new PacketListener() 

            @Override
            public void processPacket(Packet packet) 
                // TODO Auto-generated method stub
                //notification(packet.getFrom());
                packet = collector.nextResult();
                Message message = (Message)packet;
                senderName = packet.getFrom();

                int alphaPOS = senderName.indexOf("@");
                String subSenderName = senderName.substring(0,alphaPOS); 


                if(UserChatActivity.checkPresence==false)

                    notificationforChat(subSenderName+": "+message.getBody(),packet.getFrom().toString());

               

            

        , filter);

    

当用户在线时,这可以正常工作。但我希望一旦用户登录,他应该被通知他的消息

谢谢

【问题讨论】:

【参考方案1】:

您必须确保您的 XMPP 服务器支持 XEP 0136,这是 XMPP 的消息归档扩展。

该扩展名将解释如何检索已归档的消息。

对于ejabberd,您可以为此安装和配置the mod_archive extension。它将消息保存到 SQL 后端。

【讨论】:

感谢 helo @JC Brand。以上不能是一个解决方案吗?许多程序员已经实现了上述一项。 Log cat 也显示离线消息。我见过我自己。谢谢 如果您只想在用户离线时将消息发送给他/她,那么我认为这在很大程度上取决于您的 XMPP 服务器。我使用 ejabberd,一旦用户登录它就会立即发送离线消息。 好的,感谢您的帮助。好的,你的手段是你的好,但我认为它是相反的。我们可以用上面的或离线消息管理器类型的任何其他方式来做吗? @JCBrand 你有什么解决方案吗??【参考方案2】:

更改过滤器以过滤 Message.class 类型的消息而不是聊天消息,因为离线消息不是聊天类型(我不认为)

PacketFilter filter = new PacketTypeFilter(Message.class);

看看你的表现。

实际上是在重新阅读您的问题;您是说您可以在 LogCat 中看到正在接收的离线消息,但在屏幕上看不到?您在哪里记录收到的消息?

【讨论】:

以上是关于在 XMPP 中获取离线消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Agsxmpp 中获取离线消息的数量?

XMPP 获取所有名册的存在和状态消息

如何在android应用程序中从openfire获取离线消息[关闭]

XMPP4r - 无法检索离线消息

如何在 ios 中使用 XMPP 接收离线消息

XMPP Muc 查询