XMPP协议的使用(注册,登陆,注销)

时间:2022-08-06 20:31:26

利用XMPP协议简单实现登陆注销功能,一个完整的登陆过程包括初始化XMPPStream,利用用户名建立连接,建立连接成功后发送密码,XMPP默认登陆后是不在线的,所以想在线必须得自己向服务器发送在线消息,当注销时需要向服务器发送离线消息,同时断开连接,建立连接,和密码验证是否成功都是通过代理方法判,注册也是先建立连接然后用register方法发送注册密码到服务器,通过代理方法监听是否注册成功,要想登陆还得通过之前的方法登陆,但是不需要在建立连接了,因为已经建立过连接了,调用authenticateWithPasswor方法登陆即可

@interface XMPPTool ()<XMPPStreamDelegate>

/**
*XMPP核心类
*/
@property (nonatomic, strong)XMPPStream *stream;
@property (nonatomic, copy) ResultBlock resultBlock ;
@end
@implementation XMPPTool
singalton_m(XMPPTool);
/**
*加载XMPPStream
*/
-(void)setupStream
{
if (self.stream==nil) {
self.stream=[[XMPPStream alloc]init];
//设置代理在什么线程中调用
[self.stream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
}
}
-(void)xmppConnectToHost
{
XMPPJID *jid;
LSAccount *account= [LSAccount sharedAccount];
if (self.isRegisterOperation) {
jid=[XMPPJID jidWithUser:account.registerName domain:account.domain resource:nil];
}else{
jid=[XMPPJID jidWithUser:account.loginName domain:account.domain resource:nil];
}
self.stream.myJID=jid;
// 设置主机地址
self.stream.hostName=account.hostName;
//默认端口号5222
self.stream.hostPort=account.port;
NSError *error=nil;
[self.stream connectWithTimeout:XMPPStreamTimeoutNone error:&error];
if (error) {
NSLog(@"发起链接失败 %@",error);
}else {
NSLog(@"发起连接成功");
}
}
/**
*登陆
*/
-(void)xmppLogin:(ResultBlock) resultBlock;
{
[self.stream disconnect];
self.stream=nil;
self.resultBlock=resultBlock;
[self setupStream];
[self xmppConnectToHost];

}
/**
*注册
*/
-(void)xmppRegister:(ResultBlock)resultBlock
{
self.resultBlock=resultBlock;
[self.stream disconnect];
self.stream=nil;
[self setupStream];
[self xmppConnectToHost];

}
-(void)xmppStreamDidConnect:(XMPPStream *)sender
{
NSLog(@"建立连接成功");
//发送密码
if (self.isRegisterOperation) {//注册
NSString *pwd=[LSAccount sharedAccount].registerPassword;
NSError *error=nil;
[self.stream registerWithPassword:pwd error:&error];
if (error) {
NSLog(@"发起注册失败%@",error);
}
}else {//登陆

[self sendPwdToHost];
}
}
/**
*发送密码到服务器
*/
-(void)sendPwdToHost
{
NSError *error=nil;
[self.stream authenticateWithPassword:[LSAccount sharedAccount].loginPassword error:&error];
if (error) {
NSLog(@"%@",error);
}
}

/**
*登陆成功
*/
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{
NSLog(@"登陆成功");
if (self.resultBlock) {
self.resultBlock(XMPPToolResultTypeLoginSuccess);
}
//发送在线消息
[self sendOnLine];
}
/**
*登陆失败
*/
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
{

NSLog(@"登陆失败 %@",error);
if (self.resultBlock) {
self.resultBlock(XMPPToolResultTypeLoginFailure);
}
}
/**
*注册成功
*/
-(void)xmppStreamDidRegister:(XMPPStream *)sender
{
NSLog(@"注册成功");
if (self.resultBlock) {
self.resultBlock(XMPPToolResultTypeRegisterSuccess);
}
}
/**
*注册失败
*/
-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error
{
NSLog(@"注册失败 %@",error);
if (self.resultBlock) {
self.resultBlock(XMPPToolResultTypeRegisterFaliure);
}
}
/**
*发送在线消息
*/
-(void)sendOnLine
{
XMPPPresence *presence=[XMPPPresence presence];
[self.stream sendElement:presence];
NSLog(@"在线");
}

/**
*注销
*/
-(void)xmppLogout
{
[self.stream disconnect];
self.stream=nil;
//发送离线消息
[self sendOffLine];
}
/**
*发送离线消息
*/
-(void)sendOffLine
{
XMPPPresence *presence=[XMPPPresence presenceWithType:@"unavailable"];
[self.stream sendElement:presence];
}
@end