zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Daemon——守护进程
    RTMP
    CR LF CR/LF
    SO_REUSEADDR
    [aac @ ...] more samples than frame size (avcodec_encode_audio2)
    前端向后端传数据的方法
    控制层接受参数
    Swagger2
    net.sf.json------json解析
    springboot
  • 原文地址:https://www.cnblogs.com/miaomiaoshen/p/5188626.html
Copyright © 2011-2022 走看看