XMPP实现简单的登陆和注册功能的基本步骤
配置相应的文件:
A.向工程中导入XMPP包
B.在工程中加入:libxml2.tbd和libresolv.tbd两个库文件
C.在Build Settings->Search Paths->Header Search Paths添加/user/include/libxml2
D.根据提示修改剩下的错误
主要代码步骤:
1、创建一个继承自NSObject的单例类,创建一个单例对象,用于管理客户端和服务器的连接
2、重写init方法,创建唯一的管道对象,用于连接客户端和服务器端,并设置管道对象的属性和代理
注意:XMPPStream的代理用 _stream addDelegate:<#(id)#> delegateQueue:<#(dispatch_queue_t)#>方法添加,跟之前的代理属性设置不同
3、创建一个连接方法,方法中判断连接是否存在,如果存在,则断开旧的连接,再创建新的连接。
4.根据用户名和密码,实现登陆和注册,并实现相应的代理方法(6个)
//主要代码
单例类
.h文件中
import
import “XMPPManager.h”
pragma mark———-导入包
import “XMPPFramework.h”
//声明一个枚举值,列举连接状态
typedef enum : NSUInteger {
ConnectTypeLogin,
ConnectTypeRegister
} ConnectType;
@interface XMPPManager ()
//创建管道对象
@property(nonatomic,strong) XMPPStream *stream;
//创建一个状态枚举值,存储连接状态
@property(nonatomic,assign) ConnectType connectType;
//暂存登陆密码
@property(nonatomic,copy) NSString *loginPassWord;
//暂存注册密码
@property(nonatomic,copy) NSString *registerPassWord;
@end
@implementation XMPPManager
//创建一个单例对象
+ (instancetype)sharedXMPPManager{
static XMPPManager *xmppManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
xmppManager = [[XMPPManager alloc] init];
});
return xmppManager;
}
//重写初始化方法,创建一个管道对象(连接客户端和服务器端)
- (instancetype)init{
if (self = [super init]) {
//创建管道对象
_stream = [[XMPPStream alloc] init];
//设置管道连接的服务器IP地址
_stream.hostName = kHostName;
//设置管道连接的服务器端口号,确定该管道功能
_stream.hostPort = kHostPort;
//设置管道的代理
[_stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
return self;
}
//创建连接功能
-(void)connect{
//判断管道是否存在连接,如果存在,则断开旧的连接,进行新的连接
if ([_stream isConnected]) {
//断开连接
//创建xml存在的节点
XMPPPresence *presence = [[XMPPPresence alloc] initWithType:@"unavaiable"];
//设置管道节点
[_stream sendElement:presence];
//断开连接
[_stream disconnect];
}
//连接服务器
[_stream connectWithTimeout:30.f error:nil];
}
//根据用户名和密码登陆
-(void)loginWithName:(NSString )userName passWord:(NSString )passWord{
//存储登陆状态
_connectType = ConnectTypeLogin;
//存储登陆密码
_loginPassWord = passWord;
//创建xmppJid对象,是用户标识,代表一个用户
XMPPJID *jid = [XMPPJID jidWithUser:userName domain:kDomin resource:kResource];
//将jid对象加入通道中
_stream.myJID = jid;
//创建连接
[self connect];
}
//根据用户名和密码注册
-(void)registerWithName:(NSString )userName passWord:(NSString )passWord{
//存储注册状态
_connectType = ConnectTypeRegister;
//存储注册密码
_registerPassWord = passWord;
//创建xmppJid对象,是用户标识,代表一个用户
XMPPJID *jid = [XMPPJID jidWithUser:userName domain:kDomin resource:kResource];
//将jid对象加入通道中
_stream.myJID = jid;
//创建连接
[self connect];
}
pragma mark————XMPPStreamDelegate
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
NSLog(@”连接成功”);
//判断连接成功的是登陆状态还是注册状态
if (_connectType == ConnectTypeLogin) {
//验证登陆密码
[_stream authenticateWithPassword:_loginPassWord error:nil];
}
else{
//验证注册密码 注册新用户
[_stream registerWithPassword:_registerPassWord error:nil];
}
}
-(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{
NSLog(@”连接失败”);
}
//判断登陆验证是否成功
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
NSLog(@"登陆验证成功");
//上线
XMPPPresence *presence = [[XMPPPresence alloc]initWithType:@"avaiable"];
[sender sendElement:presence];
}
-(void)xmppStream:(XMPPStream )sender didNotAuthenticate:(DDXMLElement )error{
NSLog(@”登陆验证失败,失败的原因%@”,error);
}
//判断注册是否成功
-(void)xmppStreamDidRegister:(XMPPStream *)sender{
NSLog(@”注册成功”);
}
-(void)xmppStream:(XMPPStream )sender didNotRegister:(DDXMLElement )error{
NSLog(@”注册失败,失败的原因%@”,error);
}