登录注册什么的都是和服务器交互,所以我们用到的类就是XMPPStream
我先简单介绍下XMPPStream对象
//-属性
//myJID 设置XMPPJID
@property(readwrite, copy, atomic) XMPPJID *myJID;
//hostName 设置主机地址
@property(readwrite, copy, atomic) NSString *hostName;
//hostPort 设置端口号
@property(assign, readwrite, atomic) UInt16 hostPort;
//XMPPJID 介绍 jidWithUser(用户名)domain(域名)resource(设备名称)
[XMPPJID jidWithUser:@"cancer" domain:@"cancer.local" resource:nil];
//-方法
//初始化方法
-(id)init
//添加代理
- (void)addDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue
//连接到服务器方法
//连接成功则自动调用 XMPPStreamDelegaet的 xmppStreamDidConnect 代理方法
//然后在通过代理方法调用 XMPPStream的发送密码的方法authenticateWithPassword
- (BOOL)connectWithTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr
//发送密码的方法
//连接成功则自动调用 XMPPStreamDelegaet的 xmppStreamDidAuthenticate 代理方法
//授权成功 我们就可以发送一个上线请求
- (BOOL)authenticateWithPassword:(NSString *)inPassword error:(NSError **)errPtr
//发送给服务器
/**
上线
XMPPPresence *presence = [XMPPPresence presence];
离线
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
消息模块
*/
方一个 对象进去
- (void)sendElement:(NSXMLElement *)element
//断开所有的连接
- (void)disconnect;
//发送注册用户的密码给服务器
- (BOOL)registerWithPassword:(NSString *)password error:(NSError **)errPtr;
XMPPStreamDelegate
//连接建立成功的代理方法
-(void)xmppStreamDidConnect:(XMPPStream *)sender
//授权(登录)成功的代理方法
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
//授权(登录)成功的代理失败
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error
//注册成功
- (void)xmppStreamDidRegister:(XMPPStream *)sender;
//注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error;
//与服务器断开连接
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error;
登录的流程:
xmpp的登录流程是, 传递 JID , Host , Port 先连接上服务器 ,连接成功了 再 发送密码到服务器 ,授权成功 或者 授权失败
注册的流程:
xmpp的登录流程是, 传递 JID , Host , Port 先连接上服务器 ,连接成功了 再 发送注册密码到服务器 ,注册成功 或者 失败
共同点:
不管你jid存不存在 都能连接到服务器。
不同点:
发送的是授权密码 还是 发送注册密码 就是决定你是登录还是注册
//创建一个类来管理 记得让这个类成一个单例类 避免创建多个流(XMPPStream)
@interface WCXMPPTool ()<XMPPStreamDelegate>{
XMPPStream *_xmppStream;
}
@end
@implementation WCXMPPTool
//我这里用了单例头文件实现了单例类
singleton_implementation(WCXMPPTool);
#pragma mark 连接服务器
-(void)connectToHost{
if (!_xmppStream) {
//创建流
[self createStream];
}
#pragm mark 注册或登入可以做一个 BOOL 的值来做判断
XMPPJID *myJid;
NSString *user = @"qwe123";
NSString *domain = @"cancer.local";
NSString *host = @"127.0.0.1";
int port = 5222;
// 创建我们的JID
myJid = [XMPPJID jidWithUser:user domain:account.domain resource:nil];
_xmppStream.myJID = myJid;
// 设置主机地址
_xmppStream.hostName = host;
// 设置端口号 The default port is 5222.
_xmppStream.hostPort = port;
// 连接到服务器 To not time out use XMPPStreamTimeoutNone.
NSError *error;
[_xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error];
if (error) {
WCLog(@"%@",error);
}else{
WCLog(@"连接成功");
}
}
#pragm mark 创建XMPPStream对象
-(void)createStream{
//创建XMPPStream对象
_xmppStream = [[XMPPStream alloc]init];
//设置代理 连接成功后调用传密码的方法
[_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
}
#pragm mark XMPPStream代理方法
-(void)xmppStreamDidConnect:(XMPPStream *)sender{
NSLog(@"连接建立成功");
//判断是注册还是登录
if (self.registerOperation) {
//发送注册密码
NSError *error;
[_xmppStream registerWithPassword:password error:&error];
}else{
//发送密码
NSError *error;
[_xmppStream authenticateWithPassword:password error:&error];
}
}
//授权(登录)成功的代理方法
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
...
}
//授权(登录)成功的代理失败
-(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
...
}
//注册成功
- (void)xmppStreamDidRegister:(XMPPStream *)sender{
...
}
//注册失败
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error{
...
}
@end
注销
//断开所有连接
[_xmppStream disconnect];
//发送一个下线请求给服务器
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
[_xmppStream sendElement:presence];