【发布时间】:2016-07-26 07:26:15
【问题描述】:
我正面临使用 XMPP Mongoose 服务器的 smack api 在 android 应用程序中检索离线消息的问题。根据代码流尝试在用户登录 xmpp mongoose 服务器时检索离线消息,然后再将可用状态发送到 mongoose 服务器。
尝试了两种不同的方式来检索离线消息,但仍然无法找到相同的工作解决方案。我尝试过的这两种方法都在下面详细解释。
在我们用于 xmpp 连接和所有其他扩展的 Api 下方:
// Smack(XMPP 客户端库)
编译'org.igniterealtime.smack:smack-android:4.1.6'
编译'org.igniterealtime.smack:smack-tcp:4.1.6'
编译'org.igniterealtime.smack:smack-im:4.1.6'
编译'org.igniterealtime.smack:smack-android-extensions:4.1.6'
尝试使用 offlineMessageManager 检索离线消息
以下是我在登录后和向服务器发送可用状态之前尝试检索离线消息的代码
试试{
Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();
Iterator i = (Iterator) offlineMessageManager.getMessages();
while (i.hasNext())
{ 消息消息 = i.next(); System.out.println("得到文本 [" + msg.getBody() + "] 从 [" + msg.getFrom() + "]");
} 捕获(XMPPException e)
{ System.out.println("错误离线消息。"); e.printStackTrace(); }
catch (SmackException.NotConnectedException e)
{ System.out.println("错误离线消息。无连接"); e.printStackTrace(); }
catch (SmackException.NoResponseException e)
{ System.out.println("错误离线消息。无响应"); e.printStackTrace(); }
问题案例 1:
以下是上述代码执行时产生的异常详情
在下面的代码行执行时出现异常。
Iterator i = (Iterator) offlineMessageManager.getMessages();
以下是上述行执行时生成的异常描述
org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: service-unavailable - cancel
问题案例 2:
如果检查是使用来自 xmmp mongoose 服务器的 smack 从 android 代码支持的灵活离线消息,那么我得到了错误值。以下是我用于测试的代码。
Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();
问题案例 3:
当我尝试使用下面的 smack 代码使用下面的方法检索支持的功能时。
ServiceDiscoveryManager 经理 = ServiceDiscoveryManager
.getInstanceFor(连接);
列出所有功能 = manager.getFeatures();
以下是我检索的功能列表:
http://jabber.org/protocol/bytestreams,
jabber:iq:privacy, urn:xmpp:ping,
http://jabber.org/protocol/commands,
jabber:iq:版本,
jabber:iq:last,
http://jabber.org/protocol/xdata-validate,
http://jabber.org/protocol/xhtml-im,
vcard-温度,
http://jabber.org/protocol/chatstates,
urn:xmpp:receipts, urn:xmpp:time,
http://jabber.org/protocol/xdata-layout,
http://jabber.org/protocol/muc,
http://jabber.org/protocol/disco#items,
http://jabber.org/protocol/disco#info,
http://jabber.org/protocol/caps,
jabber:x:数据
尝试使用 XMPP MongooseIM 的包侦听器检索离线消息
下面是我尝试使用来自 smack api 4.1.6 的包侦听器的代码。
private static final StanzaFilter MESSAGE_PACKET_FILTER= new OrFilter(StanzaTypeFilter.MESSAGE);
配置 = XMPPTCPConnectionConfiguration.builder()
.setServiceName(SERVICE_NAME)
.setHost(KDevelopmentXMPPServer)
.setPort(PORT)
.setSendPresence(false)
.build();
//使用配置的详细信息创建xmpp连接的Connection对象
connection = new XMPPTCPConnection(configuration);
connection.addAsyncStanzaListener(new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
Log.d("CheckPacket", "OfflineMEssage");
Message message = (Message) packet;
if (message != null) {
if (message.getBody() != null) {
Log.i("XMPPClient", "Got text [" + message.getBody()
+ "] from [" + message.getFrom() + "]");
}
}
}
}, MESSAGE_PACKET_FILTER);
connection.login(用户、密码);
在此先感谢,请任何人帮助我为我的关键问题找到最佳可行的解决方案。
【问题讨论】:
-
您确定在您的 MongooseIM 实例中启用了离线消息支持(模块 mod_offline)吗?好像不是这样的。
-
嗨,erszcz,是的,它已启用。在我们正在运行的 ios 应用程序中。但问题仅存在于使用 smack api 的 android 中。
-
它将帮助您检查 XML XMPP 级别的流量。您将看到您发送到服务器的确切内容以及服务器回复的内容。
标签: android asmack mongoose-im