zoukankan      html  css  js  c++  java
  • XMPP系列(三)---获取好友列表、加入好友

    1、心跳检測、掉线重连功能

    client和server端都能够设置多久发送一次心跳包,假设对方没有返回正确的pong信息,则会断开连接,而加入掉线重连功能,则会自己主动进行连接。

    假设自己写聊天功能还得自己做心跳检測和掉线重连,比較麻烦。好在XMPP中已经做了心跳检測和掉线重连的模块,仅仅须要几行代码加进去就能实现掉线重连,很方便。

    XMPP中Extensions文件下都是能够自己加入的Module,它们都继承自XMPPModule。而加入的方法也很的简单:

    <span style="font-size:18px;">//加入功能模块
            //1.autoPing 发送的时一个stream:ping 对方假设想表示自己是活跃的。应该返回一个pong
            _xmppAutoPing = [[XMPPAutoPing alloc] init];
            //全部的Module模块。都要激活active
            [_xmppAutoPing activate:self.xmppStream];
            
            //autoPing因为他回定时发送ping,要求对方返回pong,因此这个时间我们须要设置
            [_xmppAutoPing setPingInterval:1000];
            //不不过server来得响应;假设是普通的用户,一样会响应
            [_xmppAutoPing setRespondsToQueries:YES];
            //这个过程是C---->S  ;观察 S--->C(须要在server设置)
            
            //2.autoReconnect 自己主动重连,当我们被断开了,自己主动又一次连接上去,而且将上一次的信息自己主动加上去
            _xmppReconnect = [[XMPPReconnect alloc] init];
            [_xmppReconnect activate:self.xmppStream];
            [_xmppReconnect setAutoReconnect:YES];</span>

    2.获取好友列表

    获取好友列表和好友操作都须要用到好友模块。首先加入好友模块:

    // 3.好友模块 支持我们管理、同步、申请、删除好友
            _xmppRosterMemoryStorage = [[XMPPRosterMemoryStorage alloc] init];
            _xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:_xmppRosterMemoryStorage];
            [_xmppRoster activate:self.xmppStream];
            
            //同一时候给_xmppRosterMemoryStorage 和 _xmppRoster都加入了代理
            [_xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
            //设置好友同步策略,XMPP一旦连接成功。同步好友到本地
            [_xmppRoster setAutoFetchRoster:YES]; //自己主动同步,从server取出好友
            //关掉自己主动接收好友请求。默认开启自己主动允许
            [_xmppRoster setAutoAcceptKnownPresenceSubscriptionRequests:NO];

    然后实现好友同步的代理方法:

    /**
     * 同步结束
     **/
    //收到好友列表IQ会进入的方法,而且已经存入我的存储器
    - (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_ROSTER_CHANGE object:nil];
    }

    然后在好友列表控制取出好友数据

    #pragma mark - notification event
    - (void)rosterChange
    {
        //从存储器中取出我得好友数组。更新数据源
        self.contacts = [NSMutableArray arrayWithArray:[JKXMPPTool sharedInstance].xmppRosterMemoryStorage.unsortedUsers];
        [self.tableView reloadData];
        
    }

    关于好友列表界面的cell:
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"contactCell" forIndexPath:indexPath];
        
        XMPPUserMemoryStorageObject *user = self.contacts[indexPath.row];
        UILabel *nameLabel = (UILabel *)[cell viewWithTag:1001];
        nameLabel.text = user.jid.user;
        
        UILabel *statusLabel = (UILabel *)[cell viewWithTag:1002];
        if ([user isOnline]) {
            statusLabel.text = @"[在线]";
            statusLabel.textColor = [UIColor blackColor];
            nameLabel.textColor = [UIColor blackColor];
        } else {
            statusLabel.text = @"[离线]";
            statusLabel.textColor = [UIColor grayColor];
            nameLabel.textColor = [UIColor grayColor];
        }
        
        return cell;
    }
    
    3、加入好友功能

    首先在JKXMPPTool中加入一个方法:

    - (void)addFriend:(XMPPJID *)aJID
    {
        //这里的nickname是我对它的备注。并不是他得个人资料中得nickname
        [self.xmppRoster addUser:aJID withNickname:@"好友"];
    }

    然后实现好友模块代理方法:

    // 假设不是初始化同步来的roster,那么会自己主动存入我的好友存储器
    - (void)xmppRosterDidChange:(XMPPRosterMemoryStorage *)sender
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_ROSTER_CHANGE object:nil];
    }

    收到好友请求时的处理:

    /** 收到出席订阅请求(代表对方想加入自己为好友) */
    - (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence
    {
         NSLog(@"didReceivePresenceSubscriptionRequest");
        //加入好友一定会订阅对方,可是接受订阅不一定要加入对方为好友
        self.receivePresence = presence;
        
        NSString *message = [NSString stringWithFormat:@"【%@】想加你为好友",presence.from.bare];
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:message delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"允许", nil];
        [alertView show];
        
        //允许并加入对方为好友
    //    [self.xmppRoster acceptPresenceSubscriptionRequestFrom:presence.from andAddToRoster:YES];
        //拒绝的方法
    //    [self.xmppRoster rejectPresenceSubscriptionRequestFrom:presence.from];
    }
    
    - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
    {
        //收到对方取消定阅我得消息
        if ([presence.type isEqualToString:@"unsubscribe"]) {
            //从我的本地通讯录中将他移除
            [self.xmppRoster removeUser:presence.from];
        }
    }

    demo地址:https://github.com/Joker-King/ChatDemo


  • 相关阅读:
    联邦企业架构之CIO委员会的企业架构实施指南(下)
    Environment Detection环境检测工具设计与实现
    A Grain of Sand
    Java回顾之集合
    代码与工具(C++)
    搭建后台框架
    深入.NET程序集加载
    Express作为Node.js的开发框架
    使用NuGet发布自己的类库包(Library Package)
    新浪设计规范
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7205836.html
Copyright © 2011-2022 走看看