xmpp中的offline subscribe presence接收(离线添加好友邀请的接收问题)

场景如下,jabber服务器为wildfire 3.0.1。A加B为好友,但B此时不在线。当B上线时,他应该马上收到<presence from=”A@baisong” type=”subscribe”/>,即A加B的请求。但实际上,B要发送一个<presence><c node=”http://exodus.jabberstudio.org/caps” ver=”0.9.1.0″ xmlns=”http://jabber.org/protocol/caps”/><status>Available</status><priority>1</priority></presence>,才能收到这个请求。

在网上搜索了一把,发现理论上如果B一上线,就应当收到A发来的邀请或是离线的message,但当服务器为wildfire 3.0.1的情况下,只有离线message是服务器主动发送给刚上线的B,而presence不发。服务器这样做,好像是为了实现《XEP-0013: Flexible Offline Message Retrieval》这个规范。

所以如果B想取得他在离线时别人发送的添加好友的邀请时,需要发送一个requeset。即<presence><c node=”http://exodus.jabberstudio.org/caps” ver=”0.9.1.0″ xmlns=”http://jabber.org/protocol/caps”/><status>Available</status><priority>1</priority></presence>。

我在smack中组装这个请求的代码为:
public static Presence getOfflineRequest()
{
Presence presence = new Presence(Presence.Type.AVAILABLE,null,0,Presence.Mode.AVAILABLE)
{
public String getExtensionsXML()
{
return “<c node=\”http://exodus.jabberstudio.org/caps\” ver=\”0.9.1.0\” xmlns=\”http://jabber.org/protocol/caps\”/>”;
}
};
return presence;
}

另外需要注意的是:

1、登录时不要发送avaliable的presece,否则也会接收不到offline presence。比如在smack中登录就这样:
connection.login(id, password, RESOURCE, false);

2、收到的Presence形如<presence from=”A@baisong” type=”subscribe”/>,没有to,所以也注意不要用你的Filter给过滤掉。我在smack中用了一个OrFilter来解决。
new OrFilter(new PacketTypeFilter(Presence.class),new ToContainsFilter(id))

发表评论

电子邮件地址不会被公开。 必填项已用*标注