创了一个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. Redis缓存 序列化对象存储乱码问题

    使用Redis缓存对象会出现下图现象: 键值对都是乱码形式. 解决以上问题: 如果是xml配置的 我们直接注入官方给定的keySerializer,valueSerializer,hashKeySer ...

  2. ErrorKiller:Failed to decode response: zlib_decode(): data error

    先更新composer自己,composer self-update 然后再更新依赖关系 composer update

  3. MySql全国省市区SQL语句

    CREATE TABLE IF NOT EXISTS `province` (   `id` int(11) NOT NULL auto_increment,   `provinceID` int(1 ...

  4. Spring 框架系列之 JDBC 整合实例

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.Spring框架整合 DAO 模板 JDBC:org.springframework.jdb ...

  5. ubuntu14.04 安装Jenkins

    wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'ec ...

  6. Http请求小结

    1.Http请求:get方式 public void httpGet(String url,Map<String,Object> map) { try { String joint = p ...

  7. 2015最新Android学习线路图

    Android是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google和开放手持设备联盟开发与领导.据2011年初数据显示仅正式上市两年的操作系统Android已经跃居全球最受欢迎的 ...

  8. Android 进程常驻、进程守护、进程保活技术的总结

    转载自:http://blog.csdn.net/marswin89/article/details/50917098 这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就 ...

  9. python︱模块加载(pip安装)以及pycharm安装与报错解决方式

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 准备放下R开始学python,真是痛苦,因为找 ...

  10. TOE(TCP/IP Offload Engine)网卡与一般网卡的区别

    TCP减压引擎,第一次听说这个名词,但是并不是一个新的概念了,若干年前听说过设备厂商在研究在FPGA之中实现TCP Stack,但是后来没有听到任何的产品出来,应该是路由设备to host的traff ...