美文网首页iOS开发好文iOS进阶iOS程序猿
XMPPFramework开发(二):工程配置以及登录注册

XMPPFramework开发(二):工程配置以及登录注册

作者: 神经骚栋 | 来源:发表于2016-12-16 09:48 被阅读2060次

    </br>

    搞事前言


    在前面一篇博客中说到关于Openfire的服务器的搭建,这一篇博客就从登录注册开始搞起,其实发现很多网上的XMPPFramework的使用博客都是简单的说一下其中的各种代理方法是干什么用的,各种界面之间的逻辑没有较为详细的讲解,所以骚栋准备从XMPPFramework中各种代理方法的使用情况以及一个简单的聊天App的逻辑实现,进行详细的说明讲解.恩恩,对于自己写的示例SDChat也是写了好几天了,其中还是存在不少的Bug.我准备同步更新,一边改Bug的同时,一边更新博客.希望大家谅解.

    </br>

    XMPPFramework的工程配置


    • XMPPFramework这个我没有使用cocospod,而是直接手动导入了文件夹.大家可以直接从SDChat中把XMPPFramework的拖到自己的工程中去,也可以从Github上源码原处下载.
    • 我们把XMPPFramework导入工程之后,我们需要手动导入如下的两个库.
    libxml2.tbd
    libresolv.tbd
    
    • 上面的基本就配置完成了,但是我们需要把服务器文件XMPPConfig.h配置完成.我们在工程中需要的配置项目有这么几个,分别是服务器的IP地址、服务器的的端口(默认的为5222),openfire的服务器名称、resource(资源,这个可以自行定义).

      服务器名称我们可以登录openfire的管理页面中,进行查看和修改.

      如果openfire的服务器是搭建在mac上的话,服务器的IP地址可以在网络偏好设置中进行查看.
    配置的过程有两点是需要注意的,一、如果openfire的服务器是搭建在mac上的话,服务器和移动端必须要在同一局域网内.否则,应用是连接不上服务器的.二,每一次mac的无线网络的变动,IP都有可能发生改变,如果后期连接不上,请注意查看是否是openfire的服务器的IP发生了改变.

    配置完成的示例如下所示.

    #ifndef XMPPSample_XMPPConfig_h
    #define XMPPSample_XMPPConfig_h
    
    // openfire服务器IP地址
    #define  kHostName      @"192.168.3.18"
    
    // openfire服务器端口 默认5222
    #define  kHostPort      5222
    // openfire服务器名称
    #define kDomin @"127.0.0.1"
    // resource(资源)
    #define kResource @"ios"
    
    #endif
    
    • 对于info.plist文件其实也是需要一些相关的修改的,但是基本上和XMPPFramework没有太大的关系,我们会在具体模块中进行说明.

    </br>

    XMPPFramework的登录功能实现


    由于XMPPFramework的功能比较多,所以我们需要添加一个管理单例SDXmppManager,管理XMPPFramework所有的功能.我们在SDXmppManager.h文件中导入#import "XMPPFramework.h".

    我们先一瞅SDchat中登录界面的骚包风采.~~~

    在XMPPFramework中,登录注册功能主要是由XMPPStream这个类来完成的.我们在SDXmppManager单例中创建一个XMPPStream对象属性用来管理整个应用的登录注册.

    @property(nonatomic,strong)XMPPStream *stream;
    

    然后我们在单例初始化的过程中对XMPPStream对象属性进行初始化,设置IP地址以及端口号,并且指定代理对象.

     self.stream = [[XMPPStream alloc]init];
     self.stream.hostName = kHostName;
     self.stream.hostPort = kHostPort;
      //设置stream的代理
      [self.stream addDelegate:self delegateQueue:dispatch_get_main_queue()];
    

    好了,基本的准备工作就做完了,接下来.我们先看一下具体登录流程图,然后在比对着SDChat中的登录操作代码进行详细的说明.(流程图尺寸有点大,如果看不清楚,请先下载到本地在查看.)

    流程图中基本所有的代码操作都是在SDXmppManager这个单例中完成的.登录首先其实主要分为两大步,第一步先连接服务器,第二步验证密码.流程图把两大部分拆分成好多小的步骤.

    我们先看一下如何连接服务器.如下代码所示,我们需要判断是否已经连接到服务器了.如果已经连接是需要先断开连接的,然后使用登录账号,服务器名称,资源名称(可省略)配置成基于jabber协议的由用户名生成的唯一ID,并配置到stream中去.然后调用- (BOOL)connectWithTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr方法连接服务器.

    //与服务器的建立链接
    -(void)connectToServerWintUser:(NSString *)name{
        
        if ([self.stream isConnected]) {
            
            [self.stream disconnect];
            
        }
        
        //jid jabberID,是基于jabber协议的由用户名生成的唯一ID
        self.stream.myJID = [XMPPJID jidWithUser:name domain:kDomin resource:kResource];
        
        NSLog(@"%@",self.stream.myJID);
        NSError *error = nil;
        
        //与服务器建立链接.
        [self.stream connectWithTimeout:30.0f error:&error];
        
        if (error != nil) {
            
            NSLog(@"连接失败!");
        }
        
    }
    

    上面如果验证成功之后,就会调用XMPPStream的-(void)xmppStreamDidConnect:(XMPPStream *)sender这个代理方法,我们需要在这里面进行验证密码.验证密码比较简单只需要调用[self.stream authenticateWithPassword:self.password error:&error];这一句代码即可.具体情况如下.因为注册和登录类似,所以两者需要放在了一起.

    //与服务器建立连接
    -(void)xmppStreamDidConnect:(XMPPStream *)sender{
        NSError *error = nil;
        switch (self.type) {
            case DoLgin:
    
                [self.stream authenticateWithPassword:self.password error:&error];
                if (error != nil) {
                    NSLog(@"认证过程出错!");
                }
    
                break;
                
            case DoRegiser:
                
                [self.stream registerWithPassword:self.regiserPassword error:&error];
                if (error != nil) {
                    NSLog(@"注册过程出错!");
                }
    
                break;
        }
        
    }
    

    验证完成之后,我们需要进行一些界面跳转、用户登录状态的修改以及保存密码和JID的操作,这些我是放在SDLoginVC这个控制器进行的,SDLoginVC这个控制器是登录界面的控制器.继承于SDLaunchViewController,这是我以前写的可以做动态背景的页面的控制器,感兴趣的童鞋可以点击这里看看.在SDLaunchViewController这个控制器中是有计时器的,所以我们在页面跳转的时候要把计时器(rollTimer和timer)及时的释放掉.

    //登录成功!跳转页面(代理实现)
    - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
    
        XMPPPresence *presence =  [XMPPPresence presenceWithType:@"available"];
        
        [[SDXmppManager defaulManager].stream sendElement:presence];
        
        [SDUser defaulUser].jid =[XMPPJID jidWithUser:self.userName.text domain:kDomin resource:kResource];
        [SDUser defaulUser].password = self.passWord.text;
        [[SDXmppManager defaulManager].roster fetchRoster];
    
        
        if (self.timer !=nil) {
            
            [self.timer invalidate];
            self.timer = nil;
        }
        
        if (self.rollTimer != nil) {
            [self.rollTimer invalidate];
            self.rollTimer = nil;
        }
        self.view.window.rootViewController = self.contactNC;
    
    }
    
    

    登录成功之后,我们就可以对好友列表信息和个人信息进行获取了.这个会在后面的博客中说到.登录的基本流程就是这样了.下面我们看一下注册功能的实现.

    </br>

    XMPPFramework的注册功能实现


    SDChat中注册界面如下所示,其实用户名称并没有用到,这样的注册界面在用户头像那部分也是出现了Bug的.下一步着重处理.


    注册的逻辑和登录的逻辑基本是相同的,也是两大部分,一部分是连接服务器,第二部分则是验证注册密码.主要代码跟登录的基本是一致的,就是验证方法有所不同.沿着密码的方法改为[self.stream registerWithPassword:self.regiserPassword error:&error];;

    主要用到的注册成功-(void)xmppStreamDidRegister:(XMPPStream *)sender或者失败-(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error代理方法具体代码如下所示.我们在注册成功的方法中进行了页面的跳转,在失败的方法中进行了用户的提醒.

    //当注册成功的时候进行调动
    -(void)xmppStreamDidRegister:(XMPPStream *)sender{
        
        UIAlertController *alertView = [UIAlertController alertControllerWithTitle:nil message:@"注册成功!" preferredStyle:UIAlertControllerStyleAlert];
        __weak typeof(self)temp = self;
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"返回登录" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            
            [temp popLoginVC];
    
        }];
        
        [alertView addAction:action];
        
        [self presentViewController:alertView animated:YES completion:nil];
    }
    
    //当注册不成功的时候进行调用
    -(void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{
        
        [self showAlertViewWithMessage:@"注册失败~,请检查服务器"];
    }
    

    注册完成之后,我们还可以进行个人名片的设置等操作.后期将在个人的电子模块这个部分将会说到.今天就不过多的说明了.

    </br>

    结束


    说到这里基本上XMPPFramework的工程配置以及登录注册相关的知识就说完了,下一篇博客骚栋将对XMPPFramework开发过程中好友列表的获取进行详细的说明.最后把SDChat的传送门送给大家,大家也可以自己先看一下,如果有任何问题,欢迎联系骚栋,谢谢大家了.

    -->SDChat传送门🚪

    </br>


    相关文章

      网友评论

      • 心语风尚:使用XMPPFramework开发即时通讯 这样是不是意味着用第三方的即时通讯 不是自己做的了 面试官说我们自己做即时通讯是什么意思
        神经骚栋:@心语风尚 定义协议其实就是定义传输规则和传输格式.比如你们都定义最外层是一个字典 那么你们传输之间都是传输这个字典 比如里面都有什么字段 , 没什么难度 ,但是要把文档写好,文档是最重要的
        心语风尚:一个公司说 我们自己做即时通讯 是不是意味着 这个协议也自己做
        神经骚栋:@心语风尚 xmpp是一个协议,xmpp framework 是对其协议的实现。要是自己做即时通讯也就是重新定义协议,然后用socket 进行实现。
      • ethan_cun:xmppStreamDidDisconnect,error = Connection refused, 找了下原因发现是5222端口没有打开,但是我openfire都安装好了,openfire可以登录,这是为啥?
      • Jagtu::+1: 学习下,最近在研究
      • 真爱要有你才完美:骚栋,也加不到你的其他好友联系方式,就是想你给个思路,类似微信的tableview的cell的左滑删除操作怎么做?就是咱们正常的左滑是滑动第一个cell是出现删除按钮,这时候你看微信的左滑删除下一条的信息的时候,他不是IOS系统的先取消上一个cell的左滑状态,而是直接让第二个左滑手势的cell进入左滑状态?帮帮忙~~~~~
        神经骚栋:@真爱要有你才完美 明天吧,我现在下班了,手里没电脑,明天我看看,应该很简单
        神经骚栋:@真爱要有你才完美 我留了微信号了。。。18611774420
      • 爆炸头的波波安:写的挺好的,点赞
      • 次郎:……你的网名让我一直激动不已……
        OBJECT_C:用你的DEMO就没有问题,我再看看是什么原因
        次郎:@神经骚栋 ……:hushed:……
        神经骚栋:@次郎 你要是妹子,我可以考虑一下大被同眠。。:smile::smile::smile:

      本文标题:XMPPFramework开发(二):工程配置以及登录注册

      本文链接:https://www.haomeiwen.com/subject/oegimttx.html