#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(@"注册成功");
}
本文介绍了如何使用XmppManager类实现基于XMPP协议的登录与注册功能,包括初始化、单例模式、连接服务器、验证用户身份、处理连接状态变化等关键步骤。
2563

被折叠的 条评论
为什么被折叠?



