iOS中XMPP简单聊天实现 注册和登录
1. 创建工程,完成简单页面的搭建
2.在登录页面(主页面)完成属性连线
3.创建文件夹,导入xmpp框架,配置工程
pch文件中要导入UIKit框架
4.封装xmppManager类
接口文件:
#import <Foundation/Foundation.h>#import "XMPPFramework.h" // 该类主要封装了xmpp的常用方法@interface XMPPManager : NSObject<XMPPStreamDelegate>//通信管道,输入输出流@property(nonatomic,strong)XMPPStream xmppStream;//单例方法+(XMPPManager )defaultManager;//登录的方法-(void)loginwithName:(NSString )userName andPassword:(NSString )password;//注册-(void)registerWithName:(NSString )userName andPassword:(NSString )password;-(void)logout;@end
实现文件:
单例:
#pragma mark 单例方法的实现+(XMPPManager )defaultManager{ static XMPPManager manager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ manager = [[XMPPManager alloc]init]; }); return manager;}
重写init方法:
-(instancetype)init{ if ([super init]){ //1.初始化xmppStream,登录和注册的时候都会用到它 self.xmppStream = [[XMPPStream alloc]init]; //设置服务器地址,这里用的是本地地址(可换成公司具体地址) self.xmppStream.hostName = @"127.0.0.1";// 设置端口号 self.xmppStream.hostPort = 5222;// 设置代理 [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; } return self;}
注销的实现:
-(void)logout{//表示离线不可用 XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];//向服务器发送离线消息 [self.xmppStream sendElement:presence]; //断开链接 [self.xmppStream disconnect];}
接下来实现登录的方法:
1.初始化一个xmppStream 2.连接服务器(成功或者失败) 3.成功的基础上,服务器验证(成功或者失败) 4.成功的基础上,发送上线消息
-(void)loginwithName:(NSString )userName andPassword:(NSString )password{//标记连接服务器的目的 self.connectServerPurposeType = ConnectServerPurposeLogin;//这里记录用户输入的密码,在登录(注册)的方法里面使用 self.password = password;// 创建xmppjid(用户0, @param NSString 用户名,域名,登录服务器的方式(苹果,安卓等) XMPPJID *jid = [XMPPJID jidWithUser:userName domain:@"chenyuan" resource:@"iPhone8"]; self.xmppStream.myJID = jid; //连接到服务器 [self connectToServer];}
连接到服务器的方法:
-(void)connectToServer{ //如果已经存在一个连接,需要将当前的连接断开,然后再开始新的连接 if ([self.xmppStream isConnected]) { [self logout]; } NSError error = nil; [self.xmppStream connectWithTimeout:30.0f error:&error]; if (error) { NSLog(@"error = %@",error); }}
连接到服务器有可能成功或者失败,所以有相对应的代理方法,首先要在遵循协议:<XMPPStreamDelegate>
xmppStream的代理方法:
//连接服务器失败的方法-(void)xmppStreamConnectDidTimeout:(XMPPStream )sender{ NSLog(@"连接服务器失败的方法,请检查网络是否正常");}
//连接服务器成功的方法-(void)xmppStreamDidConnect:(XMPPStream )sender{ NSLog(@"连接服务器成功的方法");//登录 if (self.connectServerPurposeType == ConnectServerPurposeLogin) { NSError error = nil;//向服务器发送密码验证 //验证可能失败或者成功 [sender authenticateWithPassword:self.password error:&error]; }//注册 else{ //向服务器发送一个密码注册(成功或者失败) [sender registerWithPassword:self.password error:nil]; }}
连接成功后,需要进行验证,注册和登录都需要,就写在一起了。
//验证成功的方法-(void)xmppStreamDidAuthenticate:(XMPPStream )sender{ NSLog(@"验证成功的方法"); /* unavailable 离线 available 上线 away 离开 do not disturb 忙碌
/ XMPPPresence presence = [XMPPPresence presenceWithType:@"available"]; [self.xmppStream sendElement:presence];}
//验证失败的方法-(void)xmppStream:(XMPPStream )sender didNotAuthenticate:(DDXMLElement )error{ NSLog(@"验证失败的方法,请检查你的用户名或密码是否正确,%@",error);}
注册:
-(void)registerWithName:(NSString )userName andPassword:(NSString )password{ self.password = password;//0.标记连接服务器的目的 self.connectServerPurposeType = ConnectServerPurposeRegister;//1. 创建一个jid XMPPJID jid = [XMPPJID jidWithUser:userName domain:@"chenyuan" resource:@"iPhone8"]; //2.将jid绑定到xmppStream self.xmppStream.myJID = jid; //3.连接到服务器 [self connectToServer];}
注册也有代理方法:
#pragma mark 注册成功的方法-(void)xmppStreamDidRegister:(XMPPStream )sender{ NSLog(@"注册成功的方法");}#pragma mark 注册失败的方法-(void)xmppStream:(XMPPStream )sender didNotRegister:(DDXMLElement *)error{ NSLog(@"注册失败执行的方法");}
到这里简单的XMPPManager工具类就封装完了。接下来就是在登录页面和注册页面完成登录和注册。
需要注意的是:xmppStream设置代理的方法:addDelegate: delegateQueue:
[[XMPPManager defaultManager].xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
它可以添加多个代理,所以通过设置代理
在登录页面当检测到登录成功时,可以在登录验证成功的方法里面push到下一个页面;
在注册页面注册成功时可以在代理方法里面实现pop回主页面。
下面是登录页面和注册页面的实现文件:
注意:用户名和密码暂时都是根据服务器得到的,自己可以配置服务器来得到