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

  • 相关阅读:
    Programming Collecive Intelligence 笔记 Making Recommendations
    Managing Gigabytes文本压缩
    Hadoop The Definitive Guide 笔记二
    POS Tagging with NLTK
    MG查询
    MG索引构造
    对SharePoint 2010的job failover的一些比较深入的说明
    SharePoint 2010中Search功能的数据库连接字符串在哪里?
    记解决一个数据库删不掉的问题
    SharePoint升级失败?
  • 原文地址:https://www.cnblogs.com/hxwj/p/4427393.html
Copyright © 2011-2022 走看看