(五)XMPP登录、注册、注销 - XMPPStream

登录注册什么的都是和服务器交互,所以我们用到的类就是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 (){
    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];

你可能感兴趣的:((五)XMPP登录、注册、注销 - XMPPStream)