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授权登录接入之前,在 ...
随机推荐
- elasticsearch 6 在 centos 6 上的安装问题
ERROR: bootstrap checks failed max file descriptors [4096] for elasticsearch process likely too low, ...
- Java经典编程题50道之二十二
利用递归方法求5!. public class Example22 { public static void main(String[] args) { int n = 5; ...
- solr6.6教程-从mysql数据库中导入数据(三)
整理多半天的solr6.6,终于算是把solr6.6中配置数据库弄出来了,网上的文章千篇一律,各说个的,没有一篇统一覆盖solr6.6版本配置的 帖子,本章节我会把配置的一些注意事项一一列举,由于时间 ...
- 来了解并防范一下CSRF攻击提高网站安全
看一下我从网上找的原理图,结合举例描述,多看一遍你就知道怎么回事了. CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具 ...
- qt 如何安装 Debuggers 调试器 ?
1.下载 SDK 或 WDK 打开网址:https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit 选择 SDK ...
- uva103 动态规划
多维矩形嵌套,和二维的一模一样.判断能否嵌套时需要先排序. AC代码: #include<cstdio> #include<cstring> #include<algor ...
- BUNOJ 1011
字符串处理的题.原题链接 AC代码: #include<cstring> #include<cstdio> #include<string> #include< ...
- linux_group总结
group_name:passwd:GID:user_list 在/etc/group 中的每条记录分四个字段: 第一字段:用户组名称: 第二字段:用户组密码: 第三字段:GID 第四字段:用户列表, ...
- javascript垃圾收集与性能问题
一.垃圾收集 JavaScript具有自动垃圾收集功能,也就是说,执行环境会负责管理代码所占用的内存. 不同于C和类C语言,这些语言都需要手动监听内存的使用情况.JavaScript实现了自动管理内存 ...
- java读取文件乱码
List<String> lines=new ArrayList<String>(); BufferedReader br = new BufferedReader(new F ...