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

利用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



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值