创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~

我们在第一篇文章中,已经介绍了Openfire服务器的搭建等环境的配置,

第二篇文章中,导入了XMPPFramework框架,

这一篇,我们将正式进入代码环节,说一说用户的登陆。

1、我们选择新建一个XMPPManager来统一管理即时聊天模块,当然,这个对象得要是个单例。并在其中配置控制台打印设置,这样能让我们看得更清楚些。

+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[XMPPManager alloc] init]; //配置日志打印工具
[DDLog addLogger:[DDTTYLogger sharedInstance] withLogLevel:XMPP_LOG_FLAG_SEND_RECV]; //打开控制台文字色彩
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];
//XMPP_LOG_FLAG_SEND | XMPP_LOG_FLAG_RECV_POST 给这2个级别一人一个颜色
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor orangeColor] backgroundColor:[UIColor whiteColor] forFlag:XMPP_LOG_FLAG_SEND];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor magentaColor] backgroundColor:[UIColor whiteColor] forFlag:XMPP_LOG_FLAG_RECV_POST];
});
return instance;
}

我们首先在这个单例中初始化一个XMPPStream对象,起到连接的作用。我们用getter方法进行加载:

- (XMPPStream *)xmppStream {
if (_xmppStream == nil) {
_xmppStream = [[XMPPStream alloc] init];
[_xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
[_xmppStream setHostName:@"172.10.0.95"];
[_xmppStream setHostPort:];
[self setupModule];
}
return _xmppStream;
}

我们先对XMPPStream进行初始化,再用addDelegate: delegateQueue:方法添加XMPPManager对象为代理。

这里的第二个参数需要注意,需要传入一个队列,这个队列,决定了回调执行的队列,是在主队列还是其他队列。

另外,XMPPStream对象可以添加多个代理,实现的原理我们会在以后讨论。简单来说,内部的实现,就是将其加入一个数组中。

HostName和HostPort是本机配置的Openfire服务器的地址和端口,并且在最后设置我们需要用到的模块。

2、设置模块

// 设置模块
- (void)setupModule {
// 心跳检测
self.xmppAutoPing = [[XMPPAutoPing alloc] initWithDispatchQueue:dispatch_get_main_queue()];
// 客户端检测频率
[self.xmppAutoPing setPingTimeout:360.0f];
// 是否响应对方的ping
[self.xmppAutoPing setRespondsToQueries:YES];
[self.xmppAutoPing addDelegate:self delegateQueue:dispatch_get_main_queue()]; // 自动重连模块
self.xmppReconnect = [[XMPPReconnect alloc] initWithDispatchQueue:dispatch_get_main_queue()];
[self.xmppReconnect setAutoReconnect:YES]; // 激活
[self.xmppAutoPing activate:self.xmppStream];
[self.xmppReconnect activate:self.xmppStream];
}

我们可以根据注释看到,分别设置了心跳检测模块,自动重连模块,并且设置了代理,并分别在XMPPStream对象上进行激活,不然不会工作。

3、连接及身份验证

我们写了一个连接登录的方法

- (void)loginWithJid:(XMPPJID *)aJid addPassword:(NSString *)password {
self.myJID = aJid;
[self.xmppStream setMyJID:aJid];
[self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:nil];
self.myPassword = password;
}

这里需要说明,JID代表了每个用户,一般由三部分构成:用户名,域名和资源名,例如 test@example.com/Anthony。

我们保存下来当前准备连接登录用户的JID和密码,并调用connectWithTimeout:error:进行连接。

还记得我们之前给XMPPStream对象设置的代理吗?现在就派上用场啦,我们刚刚设置的,在主队列进行回调,下面是回调方法。

/**
* socket连接建立成功 三次握手成功
*/
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket {
// [self.xmppStream authenticateWithPassword:self.myPassword error:nil];
} /**
* XML 流被完全打开的时候调用
* At this point it's safe to begin communication with the server.
* 在这个时间点 跟服务器对话是安全的
**/
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
//1.登录
//2.上线
[self.xmppStream authenticateWithPassword:self.myPassword error:nil];
} //登录成功的委托
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
//<presence from= to= type= >
//<show--系统状态图标/><status/>
//</presence>
//<presence/>
//1.上线
XMPPPresence *presence = [XMPPPresence presence];
[presence addChild:[DDXMLElement elementWithName:@"show" stringValue:@"xa"]];
[presence addChild:[DDXMLElement elementWithName:@"status" stringValue:@"快来找我聊天吧"]];
[self.xmppStream sendElement:presence];
}

连接成功的情况下,会调用第一个和第二个方法。我们在第二个方法里面写登录认证,认证成功后,调用第三个方法,这样,我们就登录成功了!

第三个方法中,我们可以设置我们的上线状态,调用sendElement:方法传一个XMPPPresence对象,告诉服务器我的登录状态。

当然,也有连接失败的情况,会进入下面的回调:

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error {

}

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

}

当出现失败的情况,可以找一下是不是网络的原因,或者对照下上面说的模块,如果没有解决,欢迎贴出来大家讨论一下~

以上就是用户登录的内容,下一篇,我们来说一说好友模块,下篇见~

创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~

iOS开发--XMPPFramework--用户登录(三)的更多相关文章

  1. iOS开发一个用户登录注册模块需要解决的坑

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...

  2. iOS 开发问题集锦(三)

    iOS 开发问题集锦(三) 介于群里大部分童鞋都是新手,为了大家能够更好的提问,并且提的问题能更好的得到回答,下面写几点提问时的注意事项: 1.认真对待你的问题,在提问题前有过认真的思考: 2.先在 ...

  3. iOS开发Swift篇—(三)字符串和数据类型

    iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容  let website = "http://www ...

  4. Android studio 开发一个用户登录界面

    Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...

  5. iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

    上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewControlle ...

  6. 【Python】用户登录三次锁定

    这是从另外一个博客考过了的,借鉴一下,怕下次找不到1 # -*- coding:utf-8 -*- 2 3 #登录三次锁定用户 4 5 #用于计数(循环三次的判断) 6 count = 0 7 8 # ...

  7. iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现

    相关资源地址: 本项目demo地址 :  https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载:  最新微博SDK 官网注册地址:点击打开链接 最新 ...

  8. iOS:iOS开发中用户密码保存位置

    原文来自简书:http://www.jianshu.com/p/4af3b8179136/comments/1294203 如果要实现自动登录,不必每次打开应用都去登录,我们势必要把密码保存到本地.一 ...

  9. iOS开发之第三方登录微信-- 史上最全最新第三方登录微信方式实现

    项目地址 :    https://github.com/zhonggaorong/weixinLoginDemo 最新版本的微信登录实现步骤实现: 1.在进行微信OAuth2.0授权登录接入之前,在 ...

随机推荐

  1. php define和const的区别

    1.使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数2.const用于类成员变量的定义,一经定义,不可修改.3.Define不可以用于类成员变量的定义,可用于全 ...

  2. Apache、Lighttpd、Nginx 三种web服务器对比

    简介 1.    Apache Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.Apac ...

  3. Redmine基础: 邮件配置

    1.用文本编辑器打开 D:\Bitnami\redmine-2.6.5-0\apps\redmine\htdocs\config\configuration.yml 文件,找到以下内容: 2.配置邮件 ...

  4. 深入cocos2d-x中的touch事件

    深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...

  5. python入门学习笔记(二)

    6.6替换元素 7.tuple类型 7.1创建tuple 7.2创建单元素tuple    7.3"可变"的tuple 8.条件判断和循环 8.1,if语句   8.2,if... ...

  6. Java注释用处

    1.Java注释: import cn.lonecloud.Doc; /** * Created by lonecloud on 2017/8/17. * 测试注释类型 {@link Doc#test ...

  7. hdu 1878 无向图的欧拉回路

    原题链接 hdu1878 大致题意: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 思路: 无向图存在欧拉回路的条件:1.图是连 ...

  8. 在SpringBoot中使用FluentValidator验证插件

    前言 在我们编写项目的时候,在controller中往往离不开对一些数据的校验.这里并不是说对于这些数据业务上面的校验,而是对这些数据进行空校验或者是长度校验等. 有些时候校验可以省略,根据业务的需要 ...

  9. easywechat--在thinkPHP5中的使用

    1. 安装 1.1 v-4.0 版本要求 PHP版本在7.0以上 1.2 在项目目录下运行以下命令 若未安装composer,则先安装composer -> http://docs.phpcom ...

  10. QT creator 其他资源(image)的添加以及简单利用

    QT creator 添加一些资源文件  :https://www.cnblogs.com/cszlg/p/3234786.html(转自园子) 补充: 补充:如果要给生成的exe可执行文件更换一个自 ...