• iOS XMPP(2)自己创建客户端


    一.目的以及效果:

    用Xcode利用xmpp框架建立客户端,实现向服务器注册添加用户 密码,以及登陆,离线状态

    工程的主要结构:新建singleview工程,用xib拖放两个输入框和两个按钮,

    并在viewcontroller中进行关联,建立regisgtviewcontroller同时选中xib,利用xib关联

    最终效果在网页Openfire管理控制台中可以查看

     

    二.具体过程:

    关键框架:#import "XMPPFramework.h"

    建立一个单例viewcontroller

    单例部分:

    .h文件中

    //单例的初始化方法

    +(instancetype)shareManager;

    //登陆的方法

    -(void)loginWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block;

    //注册方法

    -(void)registerWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block;

    //注销

    -(void)logOut;

    .m文件中

    //(自己写的)类的拓展 私有方法

    @interface XMPPManager1()<XMPPStreamDelegate>

    {

        //用block用来回调处理

        __block void(^_block)(NSString *name,NSString *password,int resultType);

    }

    @property(nonatomic,strong)XMPPStream *stream;

    //记录用户名 密码

    @property(nonatomic,strong)NSString *name;

    @property(nonatomic,strong)NSString *password;

    //设置bool值 登陆和注册的方法不同 需要判断

    @property(nonatomic,assign)int type;

    @end

    @implementation XMPPManager1

    //单例的初始化方法

    +(instancetype)shareManager

    {

        static XMPPManager1 *share = nil;

        static dispatch_once_t onecToken;

        dispatch_once(&onecToken, ^{

            share = [[XMPPManager1 alloc]init];

        });

        

        return share;

    }

    //只初始化一次

    -(id)init

    {

        if ([super init]) {

            //初始化xmppstream

            self.stream = [[XMPPStream alloc]init];

            //设置服务器的地址

            self.stream.hostName = @"127.0.0.1";

            //设置端口

            self.stream.hostPort = 5222;

            //设置代理

            [self.stream addDelegate:self delegateQueue:dispatch_get_main_queue()];

        }

        

        return self;

    }

    //登陆的方法

    -(void)loginWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block

    {

        self.type = 1;//登陆

        self.name = name;//记录用户

        self.password = password;//记录密码

        _block = block;

        //设置用户

        XMPPJID *jid = [XMPPJID jidWithUser:name domain:@"wuxiaoyuan.local" resource:@"iphone"];

        self.stream.myJID = jid;

        //调用连接方法

        [self connectToServer];

        

    }

    //提取出连接服务器的方法

    -(void)connectToServer

    {

        //再次点击 处于连接状态会断开连接

        if ([self.stream isConnected]) {

            [self logOut];

        }

        NSError *error = nil;

        [self.stream connectWithTimeout:XMPPStreamTimeoutNone error:&error];

        if (error) {

            NSLog(@"%@",error);

        }

    }

    //注册方法

    -(void)registerWithName:(NSString *)name andPassword:(NSString *)password block:(void(^)(NSString *name,NSString *password,int resultType))block

    {

        self.type = 2;//注册

        self.name = name;//记录用户

        self.password = password;//记录密码

        _block = block;

        

        //设置用户

        XMPPJID *jid = [XMPPJID jidWithUser:name domain:@"wuxiaoyuan.local" resource:@"iphone"];

        self.stream.myJID = jid;

        //调用连接方法

        [self connectToServer];

        

    }

    //注销

    -(void)logOut

    {

        //改变用户状态 为离线

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

        [self.stream sendElement:presence];

        //断开连接

        [self.stream disconnect];

    }

    #pragma mark --代理方法

    //连接失败

    -(void)xmppStreamConnectDidTimeout:(XMPPStream *)sender

    {

        NSLog(@"连接失败");

        if (_block) {

            _block(self.name,self.password,-1);

        }

        //需要断开连接

        [self.stream disconnect];

    }

    //连接成功

    -(void)xmppStreamDidConnect:(XMPPStream *)sender

    {

        if (self.type == 1) {

            //向服务器发送密码验证 (验证成功和验证失败)

            [self.stream authenticateWithPassword:self.password error:nil];

        }else if(self.type == 2)

        {

            //向服务器发送密码进行注册 (验证成功和验证失败)

            [self.stream registerWithPassword:self.password error:nil];

        }

    }

    //----------------------

    //验证失败

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

    {

        NSLog(@"验证失败哦");

        if (_block) {

            _block(self.name,self.password,0);

        }

        //需要断开连接

        [self.stream disconnect];

    }

    //验证成功

    -(void)xmppStreamDidAuthenticate:(XMPPStream *)sender

    {

        //改变用户状态 为在线

        XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];

        [self.stream sendElement:presence];

    }

    //----------------------

    //----------------------

    //注册失败

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

    {

        NSLog(@"注册失败");

        if (_block) {

            _block(self.name,self.password,0);

        }

        //需要断开连接

        [self.stream disconnect];

    }

    //注册成功

    -(void)xmppStreamDidRegister:(XMPPStream *)sender

    {

        NSLog(@"注册成功");

        if (_block) {

            _block(self.name,self.password,1);

        }

        //需要断开连接

        [self.stream disconnect];

    }

    //----------------------

    在其他的controller中调用单例

    关键语句:

     [[XMPPManager1 shareManager]registerWithName:self.userField.text andPassword:self.passwordField.text block:^(NSString *name, NSString *password, int resultType) {

            if (resultType == 1) {

                [self dismissViewControllerAnimated:YES completion:nil];

            }

        }];

  • 相关阅读:
    Spark使用总结与分享【转】
    用实例讲解Spark Sreaming--转
    hbase RowFilter如何根据rowkey查询以及实例实现代码 habase模糊查询【转】
    Android OpenGL ES(十三)通用的矩阵变换指令 .
    Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
    Android OpenGL ES(十一)绘制一个20面体 .
    Android OpenGL ES(十)绘制三角形Triangle .
    Android OpenGL ES(九)绘制线段Line Segment .
    Android OpenGL ES(八)绘制点Point ..
    Android OpenGL ES .介绍
  • 原文地址:https://www.cnblogs.com/wusang/p/4777877.html
Copyright © 2020-2023  润新知