iOS实现XMPP通讯(二)XMPP编程

项目概述

  • 这是一个可以登录jabber账号,获取好友列表,并且能与好友进行聊天的项目。
    使用的是第三方库XMPPFramework框架来实现XMPP通讯。
    项目地址:XMPP-Project
    如果文章和项目对你有帮助,还请给个Star⭐️,你的Star⭐️是我持续输出的动力,谢谢啦😘

  • 项目准备工作:搭建好Openfire服务器,安装客户端Spark,登录本项目的用户与登录Spark的另一用户进行XMPP通讯。

  • 项目结构概述:
    有三个视图控制器LoginViewController,FriendListViewController,ChatViewController。
    LoginViewController:登录和注册xmpp账号界面
    FriendListViewController:获取花名册(好友列表)界面
    ChatViewController:和好友进行单聊界面
    为此封装了XmppManager类,方便统一管理与服务器的连接、获取好友列表、添加好友、发送聊天消息、获取聊天消息等功能。

  • 注意:由于XMPPFramework框架还依赖其他第三方库,如KissXML、CocoaAsyncSocket等,因此用cocoaPods添加XMPPFramework库时,podfile必须添加use_frameworks!,如下:

platform:ios , '8.0'
target 'XMPP' do
    use_frameworks!
    pod 'XMPPFramework', '~> 4.0.0'
end

注册登录

  • xmpp的注册流程是:先连接xmpp服务器,连接成功后再向xmpp服务器注册账号、密码。
    xmpp的登录流程是:先连接xmpp服务器,连接成功后再进行登录的鉴权,即校验密码的准确性。

XmppManager类提供了给LoginViewController注册和登录的接口,如下:

//注册
-(void)registerWithName:(NSString *)name andPassword:(NSString *)password result:(RegisterBlock)block{
   
    self.registerBlock = [block copy];
    [self connectHost:name andPassword:password andisLogin:NO];
}
    
//登录
-(void)loginWithName:(NSString *)name andPassword:(NSString *)password result:(LoginBlock)block{
   
    self.loginBlock = [block copy];
    [self connectHost:name andPassword:password andisLogin:YES];
}

这两个接口共同调用connectHost:andPassword:result:方法,用于连接xmpp服务器(备注:islogin用来区分是登录还是注册),该方法如下:

//服务器地址(改成自己电脑的IP地址)
#define HOST @"192.168.2.2"
//端口号
#define KPort 5222
        
-(void)connectHost:(NSString *)usernameStr andPassword:(NSString *)passwordStr andisLogin:(BOOL)islogin{
   
    self.usernameStr = usernameStr;
    self.pswStr = passwordStr;
    self.isLogin = islogin;
    
    //判断当前没有连接服务器,如果连接了就断开连接
    if ([self.xmppStream isConnected]) {
   
        [self.xmppStream disconnect];
    }
    //设置服务器地址
    [self.xmppStream setHostName:HOST];
    //设置端口号
    [self.xmppStream setHostPort:KPort];
    //设置JID账号
    XMPPJID *jid = [XMPPJID jidWithUser:self.usernameStr domain:HOST resource:nil];
    [self.xmppStream setMyJID:jid];
    
    //连接服务器
    NSError *error = nil;
    //该方法返回了bool值,可以作为判断是否连接成功,如果10s内顺利连接上服务器返回yes
    if ([self.xmppStream connectWithTimeout:10.0f error:&error]) {
   
        NSLog(@"连接成功");
    }
    //如果连接服务器超过10s钟
    if (error) {
   
        NSLog(@"error = %@",error);
    }
}

由于我设置了电脑充当Openfire服务器,因而电脑当前WiFi的IP地址(比如192.168.3.133)就是Openfire服务器的地址,因而HOST参数要配置电脑当前WiFi的IP地址才能让手机连上Openfire服务器。
注意:由于首次配置Openfire后台服务器时,服务器名称设置了192.168.2.2(因为首次配置时电脑WiFi的IP地址为192.168.2.2),主机名配置127.0.0.1,因此192.168.2.2就作为Openfire服务器的主机名。不管HOST参数设置成什么,收发的XML包的域名(domain)都是192.168.2.2。
Openfire后台服务器配置的客户端连接端口默认是5222,因此这里KPort的值设为5222。后台配置如下:

输入账号、密码并按下注册或登录按钮后,app会向XMPP服务器进行连接请求,服务器连接成功会有相应的回调,在连接成功的回调中进行密码校验或账号注册操作。即如下所示:

//除了上面可以判断是否连接上服务器外还能通过如下这种形式判断
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
   
    NSLog(@"连接服务器成功");
    //这里要清楚,连接服务器成功并不是注册成功或登录成功【可以把“连接服务器成功”当做接收到当前服务器开启了的通知】
    if (self.isLogin) {
   
        //进行验证身份(或者叫进行登录)
        [self.xmppStream authenticateWithPassword:self.pswStr error:nil];
    }else{
   
        //进行注册
        [self.xmppStream registerWithPassword:self.pswStr error:nil];
    }
}

对于注册成功或登录验证成功的回调结果,XmppManager类中有相应的回调方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值