zoukankan      html  css  js  c++  java
  • xmpp 登录注册小结

    将XMPPStream放在APPDelegate,以便全局访问

    #pragma mark - XMPP相关的属性和方法定义
    /**
     *  全局xmppstream,只读属性
     */
    @property (strong,nonatomic,readonly) XMPPStream *xmppStream;
    
    /**
     *  通知服务器用户上线
     */
    - (void)goOneline;
    
    /**
     *  通知服务器用户下线
     */
    - (void)goOffline;

    XMPPStream相关方法

    #pragma mark - 设置XMPPStream
    
    - (void)setupStream {
        //避免被重复实例化
        if (_xmppStream == nil) {
            //1.实例化XMPPStream
            _xmppStream = [[XMPPStream alloc]init];
            //2.添加代理
            //因为所有网络请求都是做基于网络数据处理,跟UI界面无关,因此可以让代理方法在其它线程中运行
            //从而提高程序的运行性能
            [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
        }
        
    }
    
    #pragma mark - 通知服务器用户上线
    
    - (void)goOneline {
        //1.实例化一个"展现",上线的报告
        XMPPPresence *presence = [XMPPPresence presence];
        //2.发送presence给服务器
        //服务器知道"我"上线后,只需要通知我的好友,而无需通知我,因此,次方法没有回调
        [_xmppStream sendElement:presence];
        
    }
    
    #pragma mark - 通知服务器用户下线
    
    - (void)goOffline {
        NSLog(@"用户下线");
        //1.实例化一个“展现”,下线报告
        XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
        //2.发送Presence给服务器,通知服务器客户端下线
        [_xmppStream sendElement:presence];
    }

    connect&disConnect与服务器连接与断开

    - (void)connect {
        //1.设置XMPPStream
        [self setupStream];
        //2.设置用户名,密码,主机(服务器),连接时不需要password
        NSString *userName = [[NSUserDefaults standardUserDefaults]objectForKey:kXMPPUserNameKey];
        NSString *hostName = [[NSUserDefaults standardUserDefaults]objectForKey:kXMPPHostNameKey];
        //3.设置XMPPStream的JID和主机
    //    [_xmppStream setMyJID:[XMPPJID jidWithString:userName]]; //@127.0.0.1
        [_xmppStream setMyJID:[XMPPJID jidWithUser:userName domain:[[NSUserDefaults standardUserDefaults]objectForKey:kXMPPHostNameKey] resource:nil]];
        [_xmppStream setHostName:hostName];
        //4.开始链接
        NSError *error = nil;
        [_xmppStream connectWithTimeout:10 error:&error];
        //提示:如果没有制定JID和hostName,才会出错,其他都不会出错
        if (error) {
            NSLog(@"连接请求发送出错:%@",error.localizedDescription);
        }else {
            NSLog(@"连接请求发送成功");
        }
    }
    - (void)disConnect {
        //1.通知服务器下线
        [self goOffline];
        //2.XMPPStream断开连接
        [_xmppStream disconnect];
    }

    XMPPStream代理方法

    1.连接完成(如果服务器地址不对不会调用这个方法)

    - (void)xmppStreamDidConnect:(XMPPStream *)sender;

    在这里面一般发送身份验证请求和注册请求

      if (_isRegisterUser) {
            // 用户注册,发送注册请求
            [_xmppStream registerWithPassword:password error:nil];
        } else {
            // 用户登录,发送身份验证请求
            [_xmppStream authenticateWithPassword:password error:nil];
        }

    2.注册

    成功:

    - (void)xmppStreamDidRegister:(XMPPStream *)sender;

    失败:(一般原因是用户名已经存在)

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

    3.身份验证(登录)

    成功:

    - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender;

    失败:

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

    注意:这里失败原因一般是密码错误,还有一种,如果错误是:

    //<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized></not-authorized></failure>

    错误原因及解决办法:http://www.cnblogs.com/hxwj/p/4420776.html

  • 相关阅读:
    RSA加密算法
    ios 经典错误
    C--指针函数,static
    svn---命令行操作
    iOS中的自由桥接
    ios--socket
    ios错误修改了系统头文件
    ios数据库FMDB
    CoreDate的使用
    ios简单数据库运用
  • 原文地址:https://www.cnblogs.com/hxwj/p/4427393.html
Copyright © 2011-2022 走看看