XMPP实现登陆注销功能

XMPP框架的下载与导入等问题请参照 —— XMPP框架的分析、导入及问题解决



这篇我们利用XMPP框架来实现一下登陆功能,先来介绍一下XMPP框架内的几个比较重要的文件
XMPPStream:开发过程中主要的交互类,所有自定义代码和拓展都基于此类
* XMPPParser:提供XMPPStream解析
* XMPPJID:提供一个JID(不可改变)实现,遵循NSCopying协议和NSCoding协议
* XMPPElement:以下三个XMPP元素的基类
* XMPPIQ:数据请求
* XMPPMessage:消息
* XMPPPresence:是否在线状态
* XMPPModule:开发XMPP拓展时使用
* XMPPLogging:XMPP日志框架
* XMPPInternal :整个XMPP框架内部核心和底层内容

注:
为了开发更效率,建议把XMPPStream放到AppDelegate中,便于全局访问。
XMPP本身只提供接收IQ、Message和Presence三种XMPP类型的代理委托系统,要实现更多的功能,就需要我们编写相关的代码。

接下来我们来配置XMPPStream实例
1. 配置连接服务器的方式
2. 添加代理
3. 添加模块
4. 开始连接
5. 开始授权

XMPP登录的方式和我们正常情况下登录的习惯不同,它是客户端与服务器先建立一个长连接,然后客户端将JID发送到服务器,服务器告诉客户端已经连接成功,然后客户端再把密码发送给服务器,如图:
XMPP实现登陆注销功能
了解了XMPP的连接过程,我们就按照这个过程来实现登录和注销模块
1>
XMPP实现登陆注销功能
2>
XMPP实现登陆注销功能
首先我们要引用XMPPFramework.h头文件,设置代理,添加成员变量,为了方便理解,在这里将登录分别放到5个方法内(其中初始化、连接服务器、连接成功后发送密码、授权成功后发送在线消息为私有方法,而注销则为公共方法方便外界调用)。然后在XMPP代理方法中适当调用

#pragma mark - XMPP

// 初始化XMPPStream

- (void)setupXMPPStream

{

    _xmppStream = [[XMPPStream alloc] init];

    

    // 设置代理

    [_xmppStream addDelegate:selfdelegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)];

}


初始化完成后我们就要和服务器进行连接

// 连接服务器

- (void)connectToHost

{

    // 连接服务器

    if (!_xmppStream) {

        [self setupXMPPStream];

    }

    

    // 设置JID resource标记登录的客户端

    XMPPJID *myJID = [XMPPJID jidWithUser:@"wangwu"domain:@"xxxxxxxxxxxxxxx.local" resource:@"iOS"];

    _xmppStream.myJID = myJID;

    

    // 设置服务器域名 可设置域名或者IP地址

    _xmppStream.hostName = @"xxxxxxxxxxxxxx.local";

    // 设置端口(默认的话可省略)

    _xmppStream.hostPort = 5222;

    

    // 连接

    NSError *error = nil;

    if (![_xmppStream connectWithTimeout:XMPPStreamTimeoutNoneerror:&error]) {

        NSLog(@"%@",error);

    }

}


有登录对应的就有注销功能,所以我们先来完成注销


// 注销

- (void)disConnectToHost

{

    // 发送离线消息,在DEMO里面我们可以清楚看到"unavailable"表示离线的意思

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

    [_xmppStream sendElement:offline];

    

    // 与服务器断开连接

    [_xmppStream disconnect];

    

}


连接成功后,我们需要获得授权,所以把密码发送给服务器


// 发送密码

- (void)sendPwdTOHost

{

    NSError *error = nil;

    [_xmppStream authenticateWithPassword:@"123456" error:&error];

    if (error)

    {

        NSLog(@"%@", error);

    }

}


授权成功后,我们需要告诉服务器,谁在线,所以给服务器发送一条在线的消息


// 发送在线消息

- (void)sendOnlineTOHost

{

    XMPPPresence *presence = [XMPPPresence presence];

    // 发送

    [_xmppStream sendElement:presence];

}


#pragma mark - XMPPStream代理


// 连接成功

- (void)xmppStreamDidConnect:(XMPPStream *)sender

{

    NSLog(@"与服务器连接成功!");

    

    // 成功后发送密码进行授权操作

    [self sendPwdTOHost];

}


// 连接失败

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError*)error

{

    NSLog(@"与主机断开连接%@",error);

}


// 授权成功

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender

{

    NSLog(@"授权成功");

    // 发送在线消息

    [self sendOnlineTOHost];

}


// 授权失败

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

{

    NSLog(@"授权失败");

}


到这里XMPP的登录和注销就演示完毕了,本篇的DEMO请前往 —— XMPP实现登录与注销功能 下载,密码:5i3f

如果有什么错误或者问题,可以联系我,转载请注明出处,谢谢!

原文地址:https://www.cnblogs.com/miaomiaoshen/p/5188626.html