美文网首页iOS开发专区IM即时通讯
XMPPFramework开发(七):好友上下线和重新连接

XMPPFramework开发(七):好友上下线和重新连接

作者: 神经骚栋 | 来源:发表于2016-12-23 16:47 被阅读3176次

    前言


    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来对照本篇博客的技术点.

    -->SDChat传送门🚪

    相关文章

      网友评论

      本文标题:XMPPFramework开发(七):好友上下线和重新连接

      本文链接:https://www.haomeiwen.com/subject/tkykvttx.html