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


搞事前言


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


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没有太大的关系,我们会在具体模块中进行说明.


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;

}

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


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:@"注册失败~,请检查服务器"];
}

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


结束


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

-->SDChat传送门🚪


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • error code(错误代码)=0是操作成功完成。error code(错误代码)=1是功能错误。error c...
    Heikki_阅读 3,352评论 1 9
  • 来~,我们先来瞧瞧我们等下将要安装的资源,如下图所示: 看完我们将要安装的资源,我先讲一下安装的顺序哈~ 1. 安...
    景彧阅读 345评论 0 3
  • error code(错误代码)=2000是无效的像素格式。error code(错误代码)=2001是指定的驱动...
    Heikki_阅读 1,764评论 0 4
  • XMPPFramework开发前言 这两天没有更新博客,这里先对大家说声对不起了.因为这几天一直忙于研究XMPPF...
    神经骚栋阅读 6,609评论 56 73