即时通讯-1

本文介绍了如何使用XmppManager类实现基于XMPP协议的登录与注册功能,包括初始化、单例模式、连接服务器、验证用户身份、处理连接状态变化等关键步骤。

#import "XmppManager.h"



//枚举,用做标示符

typedef NS_ENUM(NSUInteger, ConnectPurpose) {

    ConnectPurposeLogin,  //登陆

    ConnectPurposeRegister  //注册

};


@interface XmppManager ()<XMPPStreamDelegate>  //协议


//链接服务器的目的

@property(nonatomic)ConnectPurpose purpose;



//用来接收外面传进来的密码

@property(nonatomic,copy)NSString *loginPwd;

@property(nonatomic,copy)NSString *registerPwd;


@end



@implementation XmppManager


//单例

+(instancetype)sharedManager{

    static XmppManager *manager=nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        manager=[XmppManager new];

    });

    return manager;

}


#pragma mark  初始化

- (instancetype)init

{

    self = [super init];

    if (self) {

        

        self.stream=[[XMPPStream alloc]init];

        //服务器IP地址

        _stream.hostName=kHostName;

        //端口号 区别功能

        _stream.hostPort=kHostPort;

        [_stream addDelegate:self delegateQueue:dispatch_get_main_queue()];

    }

    return self;

}



#pragma mark ---XMPPStreamDelegate

#pragma mark  --连接成功

-(void)xmppStreamDidConnect:(XMPPStream *)sender{

    NSLog(@"成功%s,%d",__FUNCTION__,__LINE__);

    

    

    //判断注册 还是 登陆

    if (self.purpose==ConnectPurposeLogin) {

        //登陆  需要验证

        [sender authenticateWithPassword:self.loginPwd error:nil];

    }else{

        //注册  注册新用户

        [sender registerWithPassword:self.registerPwd error:nil];

    }

}


#pragma mark  --连接失败

-(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender{

    NSLog(@"失败%s,%d",__FUNCTION__,__LINE__);

}



-(void)connect{

    

   //判断当前有无链接,如果有则断开,在建立新的连接

    

    [_stream connectWithTimeout:30.f error:nil];

    

    if ([_stream isConnected]) {

        //断开连接

        XMPPPresence *presence=[XMPPPresence presenceWithType:@"unavailable"];


        [_stream sendElement:presence];

        

        [_stream disconnect];

    }

}



//注册

-(void)registerWithUserName:(NSString *)name password:(NSString *)pwd{

    

    //XMPPJID 用户信息 类似邮箱

    

    XMPPJID *jid=[XMPPJID jidWithUser:name domain:kDomin resource:kResource];

    

    _stream.myJID=jid;

    

    //注册

    self.purpose=ConnectPurposeRegister;

    

    self.registerPwd=pwd;

    

    NSLog(@"注册::%s,%d",__FUNCTION__,__LINE__);

    

    //连接服务器

    [self connect];

}


//登陆

-(void)loginWithUserName:(NSString *)name password:(NSString *)pwd{

    

    //XMPPJID 用户信息 类似邮箱

    

    XMPPJID *jid=[XMPPJID jidWithUser:name domain:kDomin resource:kResource];

    

    _stream.myJID=jid;

    self.purpose=ConnectPurposeLogin;

    

    self.loginPwd=pwd;

    

    NSLog(@"注册::%s,%d",__FUNCTION__,__LINE__);

    

    //连接服务器

    [self connect];

}


//验证失败

-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{

    NSLog(@"验证失败");

}


//验证成功

-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{

  

    

    //上线

    XMPPPresence *presence=[XMPPPresence presenceWithType:@"available"];

    [_stream sendElement:presence];

    

    NSLog(@"验证成功");

}


//注册失败

-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{

    NSLog(@"注册失败");

}



//注册成功

-(void)xmppStreamDidRegister:(XMPPStream *)sender{

    NSLog(@"注册成功");

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值