XMPPFramework开发(七):好友上下线和重新连接
前言
XMPPFramework写到这一篇基本就要结束了,可能后期还要更新SDChat,如果有更新的话,骚栋会同步更新博客的,前面我们说了XMPPFramework中几个比较大功能,这一篇我们将说一下关于用户上下线和重新连接.
用户上下线状态获取
用户上下线相比其他功能要简单的多,就是在AppDelegate的XMPPSteam的- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
代理方法中获取到好友节点状态的.在XMPPFramework开发(五):添加/删除好友这篇文章中,我们曾经使用这个方法获取好友节点取消订阅我的消息,这里我们也可以使用这个方法确定好友的上下线状态.上下线状态类型有两个值.如下所示.
//上线状态
"available"
//离线状态
"unavailable"
我们只需要找到对应的好友把状态改变即可.当然了,为了防止一个好友节点状态获取多次,我们需要先判断当前状态和需要修改的状态是否一致,如果一致就不修改,如果不一致,那么修改完好友状态之后通知好友列表页面进行刷新操作即可.这里我们只拿上线状态来进行说明解释,离线状态与之类似,代码如下所示.
if ([presence.type isEqualToString:@"available"] && ![presence.from isEqual:user.jid]) {
for (SDContactModel *obj in user.contactsArray) {
if ([presence.from.user isEqualToString:obj.jid.user]) {
if (!obj.isAvailable) {
obj.isAvailable = YES;
//发送上线通知
[[NSNotificationCenter defaultCenter]postNotificationName:ContactIsAvailable object:obj];
}
}
}
}
这里有一个小逻辑我需要说一下,那就是在添加好友节点数据(代理方法为-(void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(DDXMLElement *)item
)的时候,我们需要先把好友状态全部设置为离线状态,当获取完好友节点的时候,获取好友节点状态这个代理方法才会执行.然后,方法中会把当前在线的用户更改为上线状态.
经过上面的代码,我们就可以实时的获取好友上下线状态了.
登录与重新连接
当用户的应用进入后台的时候,如果不做任何操作,用户其实是与服务器断开了连接的,那么我们想让用户应用从后台进入前台的时候,用户可以重新与服务器进行连接.XMPPFramework已经为我们提供了对应的类,那么就是XMPPReconnect,接下来我们看看在SDChat中,骚栋是如何实现断线重连的.
在XMPPFramework开发(二):工程配置以及登录注册,我们曾经在登录成功之后保存了登录者的账号和密码.就是用于断线重连的时候使用的,具体代码位置如下图所示.
在SDXmppManager初始化过程中我们需要对XMPPReconnect属性对象进行初始化的操作,并且进行激活,代码如下所示.
self.reconnect = [[XMPPReconnect alloc] init];
[self.reconnect activate:self.stream];
激活完成之后,我们需要在AppDelegate中设置XMPPReconnect属性对象的代理对象.如下所示.
SDXmppManager *manager = [SDXmppManager defaulManager];
[manager.reconnect addDelegate:self delegateQueue:dispatch_get_main_queue()];
在AppDelegate中设置完代理之后,当用户从后台进入前台的时候,XMPPReconnect对象检测到用户是离线状态之后,会自动连接服务器,然后在- (void)xmppReconnect:(XMPPReconnect *)sender didDetectAccidentalDisconnect:(SCNetworkConnectionFlags)connectionFlags
方法,所以我们需要在方法中实现用户的登录,不过在登录之前,我们需要先把用户数据重新清理一下.整体代码如下所示.
//重新连接成功
- (void)xmppReconnect:(XMPPReconnect *)sender didDetectAccidentalDisconnect:(SCNetworkConnectionFlags)connectionFlags{
[SDUser clearAllData];
[[SDXmppManager defaulManager].stream authenticateWithPassword:[SDUser defaulUser].password error:nil];
}
//登录成功的方法.
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
[[SDXmppManager defaulManager].stream sendElement:presence];
[[SDXmppManager defaulManager].roster fetchRoster];
}
结束
这篇文章写到这里基本就结束了,好友上下线和重新连接算的上是两个比较小的功能点,如果在SDChat中遇到任何问题,欢迎联系骚栋,最后仍然还是把SDChat的传送门送给大家.大家可以对照着SDChat的Demo来对照本篇博客的技术点.