iOS开发--XMPPFramework--用户登录(三)
创了一个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--用户登录(三)的更多相关文章
- iOS开发一个用户登录注册模块需要解决的坑
最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...
- iOS 开发问题集锦(三)
iOS 开发问题集锦(三) 介于群里大部分童鞋都是新手,为了大家能够更好的提问,并且提的问题能更好的得到回答,下面写几点提问时的注意事项: 1.认真对待你的问题,在提问题前有过认真的思考: 2.先在 ...
- iOS开发Swift篇—(三)字符串和数据类型
iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http://www ...
- Android studio 开发一个用户登录界面
Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...
- iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流
上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewControlle ...
- 【Python】用户登录三次锁定
这是从另外一个博客考过了的,借鉴一下,怕下次找不到1 # -*- coding:utf-8 -*- 2 3 #登录三次锁定用户 4 5 #用于计数(循环三次的判断) 6 count = 0 7 8 # ...
- iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现
相关资源地址: 本项目demo地址 : https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载: 最新微博SDK 官网注册地址:点击打开链接 最新 ...
- iOS:iOS开发中用户密码保存位置
原文来自简书:http://www.jianshu.com/p/4af3b8179136/comments/1294203 如果要实现自动登录,不必每次打开应用都去登录,我们势必要把密码保存到本地.一 ...
- iOS开发之第三方登录微信-- 史上最全最新第三方登录微信方式实现
项目地址 : https://github.com/zhonggaorong/weixinLoginDemo 最新版本的微信登录实现步骤实现: 1.在进行微信OAuth2.0授权登录接入之前,在 ...
随机推荐
- Redis缓存 序列化对象存储乱码问题
使用Redis缓存对象会出现下图现象: 键值对都是乱码形式. 解决以上问题: 如果是xml配置的 我们直接注入官方给定的keySerializer,valueSerializer,hashKeySer ...
- ErrorKiller:Failed to decode response: zlib_decode(): data error
先更新composer自己,composer self-update 然后再更新依赖关系 composer update
- MySql全国省市区SQL语句
CREATE TABLE IF NOT EXISTS `province` ( `id` int(11) NOT NULL auto_increment, `provinceID` int(1 ...
- Spring 框架系列之 JDBC 整合实例
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.Spring框架整合 DAO 模板 JDBC:org.springframework.jdb ...
- ubuntu14.04 安装Jenkins
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'ec ...
- Http请求小结
1.Http请求:get方式 public void httpGet(String url,Map<String,Object> map) { try { String joint = p ...
- 2015最新Android学习线路图
Android是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google和开放手持设备联盟开发与领导.据2011年初数据显示仅正式上市两年的操作系统Android已经跃居全球最受欢迎的 ...
- Android 进程常驻、进程守护、进程保活技术的总结
转载自:http://blog.csdn.net/marswin89/article/details/50917098 这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就 ...
- python︱模块加载(pip安装)以及pycharm安装与报错解决方式
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 准备放下R开始学python,真是痛苦,因为找 ...
- TOE(TCP/IP Offload Engine)网卡与一般网卡的区别
TCP减压引擎,第一次听说这个名词,但是并不是一个新的概念了,若干年前听说过设备厂商在研究在FPGA之中实现TCP Stack,但是后来没有听到任何的产品出来,应该是路由设备to host的traff ...