(六十八)使用XMPPFramework登录
按照XMPPFramework的官方样例,应该把登录代码放置在AppDelegate中,并且让注销成为私有方法。
XMPPFramework进行登录的步骤如下:
①连接主机,并且发送JID
②如果连接成功,则发送密码进行授权
③授权成功后,发送上线消息
④如果要注销,发送下线消息,并且断开连接。
一般让XMPPFramework工作在子线程中,和异步socket类似,通过代理来处理各个状态。
下面是使用框架登录的步骤:
①包含XMPPFramework.h
②定义XMPPStream成员属性,遵循XMPPStream代理协议:
@interface AppDelegate () <XMPPStreamDelegate>{
XMPPStream *_stream;
}
③在application didFinishLaunch...方法中调用connectToHost方法连接主机:
注意其中XMPPStream的connectWithTimeout: error:方法返回false代表失败,应该打印错误信息。
这里使用的是本地openfire服务器,登录账户zs@soulghost.local,密码为123456。
如果XMPPStream为空,说明还没有创建,进行初始化:
- (void)setupXMPPStream{
_stream = [[XMPPStream alloc] init];
[_stream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
}
连接主机的代码:
- (void)connectToHost{
if (_stream == nil) {
[self setupXMPPStream];
}
_stream.hostName = @"localhost";
_stream.hostPort = 5222;
// resource用于标识用户登陆的客户端类型
XMPPJID *myJID = [XMPPJID jidWithUser:@"zs" domain:@"soulghost.local" resource:@"iPhone"];
_stream.myJID = myJID;
NSError *err = nil;
if(![_stream connectWithTimeout:XMPPStreamTimeoutNone error:&err]){
NSLog(@"%@",err);
}
}
④连接主机成功和失败都有代理方法,如果成功应该发送密码:
- (void)xmppStreamDidConnect:(XMPPStream *)sender{
NSLog(@"连接成功");
[self sendPwdtoHost];
}
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error{
NSLog(@"连接断开,%@",error);
}
⑤如果连接成功,发送密码:
- (void)sendPwdtoHost{
NSError *err = nil;
[_stream authenticateWithPassword:@"123456" error:&err];
if (err) {
NSLog(@"%@",err);
}
}
⑥授权成功和失败都有相应的方法:
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
NSLog(@"授权成功");
[self sendOnlineToHost];
}
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{
NSLog(@"授权失败,%@",error);
}
⑦如果授权成功,应该发送在线消息,在线是通过发送带有available标识的presence实现的:
- (void)sendOnlineToHost{
XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
[_stream sendElement:presence];
}
⑧如果要离线,只需要发送带有unavailable标识的presence即可:
调用XMPPStream的disconnect方法可以断开与主机的连接。
- (void)logout{
// 发送离线消息
XMPPPresence *offline = [XMPPPresence presenceWithType:@"unavailable"];
[_stream sendElement:offline];
NSLog(@"注销成功");
// 与服务器断开连接
[_stream disconnect];
}
⑨如果要在其他地方调用logout,只需要得到AppDelegate单例调用:
// 注销登录
AppDelegate *app = [UIApplication sharedApplication].delegate;
[app logout];
(六十八)使用XMPPFramework登录的更多相关文章
- 《剑指Offer》题六十一~题六十八
六十一.扑克牌中的顺子 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2~10为数字本身,A为1,J为11,Q为12,K为13,而大.小王可以看成任意数字. 六十二.圆圈中 ...
- 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...
- SpringBoot进阶教程(六十八)Sentinel实现限流降级
前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...
- FastAPI(六十八)实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发
在之前的文章:FastAPI(六十七)实战开发<在线课程学习系统>接口开发--用户登陆接口开发,今天实战:用户 个人信息接口开发. 在开发个人信息接口的时候,我们要注意了,因为我们不一样的 ...
- 六十八、SAP中内表插入的三种方法之二,COLLECT的使用,用于计算数字字段之和
一.使用COLLECT时,如果关键字没有,那么插入,如果有则求所有关键字列的和,代码如下 二.sy-index在循环中,每次循环从1开始递增 三.查看T_DATA数据 四.如下 五.循环时候,我们查看 ...
- NOIP 模拟 六十八
咕了十几场了,还是写一写吧.. T1 玩水 发现满足三个人路径不同必须要有2个及以上的斜线相同结构,需要注意如果同一行或者同一列的话必须要相邻才行. #include<bits/stdc++.h ...
- Liferay 6.2 改造系列之十八:修改登录Portlet配置,去除无用链接
在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sections that will b ...
- 第六十八篇、OC_按照某一字段对数值进行排序
代码中是根据"create_time_" 进行排序 ascending:决定的是升序还是降序排序 NSSortDescriptor *sortDescriptor = [[NS ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
随机推荐
- python2.7入门---操作mysql数据库增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...
- 清空dataset中的某行某列的数据
string tempSFZH = ""; foreach (DataRow rs in ds.Tables[0].Rows) { tempSFZH = rs[ht[&qu ...
- Python小代码_1_九九乘法表
Python小代码_1_九九乘法表 max_num = 9 row = 1 while row <= max_num: col = 1 while col <= row: print(st ...
- 16. 3Sum Closest(中等)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- window环境搭建zookeeper,kafka集群
为了演示集群的效果,这里准备一台虚拟机(window 7),在虚拟机中搭建了单IP多节点的zookeeper集群(多IP节点的也是同理的),并且在本机(win 7)和虚拟机中都安装了kafka. 前期 ...
- POJ 3050 Hopscotch DFS
The cows play the child's game of hopscotch in a non-traditional way. Instead of a linear set of num ...
- jQuery – AJAX get() 和 post() 方法
jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...
- linux系统性能监控--I/O利用率
尽管整体的处理器速度. 内存大小以及 I/O执行速度在不断提高,但 I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级.另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成 ...
- Activity的四种启动模式任务栈图解
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 今天带来另一篇Activity的文章--Activity的四种启动模式.该篇文章,会以图文讲解的方式带你彻底掌握Activity的启动 ...
- hive中的NULL(hive空值处理)
HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N, 这样造成浪费大量空间.而且用java.python直接进入 ...