按照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登录的更多相关文章

  1. 《剑指Offer》题六十一~题六十八

    六十一.扑克牌中的顺子 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2~10为数字本身,A为1,J为11,Q为12,K为13,而大.小王可以看成任意数字. 六十二.圆圈中 ...

  2. 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)

    1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...

  3. SpringBoot进阶教程(六十八)Sentinel实现限流降级

    前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...

  4. FastAPI(六十八)实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发

    在之前的文章:FastAPI(六十七)实战开发<在线课程学习系统>接口开发--用户登陆接口开发,今天实战:用户 个人信息接口开发. 在开发个人信息接口的时候,我们要注意了,因为我们不一样的 ...

  5. 六十八、SAP中内表插入的三种方法之二,COLLECT的使用,用于计算数字字段之和

    一.使用COLLECT时,如果关键字没有,那么插入,如果有则求所有关键字列的和,代码如下 二.sy-index在循环中,每次循环从1开始递增 三.查看T_DATA数据 四.如下 五.循环时候,我们查看 ...

  6. NOIP 模拟 六十八

    咕了十几场了,还是写一写吧.. T1 玩水 发现满足三个人路径不同必须要有2个及以上的斜线相同结构,需要注意如果同一行或者同一列的话必须要相邻才行. #include<bits/stdc++.h ...

  7. Liferay 6.2 改造系列之十八:修改登录Portlet配置,去除无用链接

    在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sections that will b ...

  8. 第六十八篇、OC_按照某一字段对数值进行排序

    代码中是根据"create_time_" 进行排序   ascending:决定的是升序还是降序排序 NSSortDescriptor *sortDescriptor = [[NS ...

  9. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

随机推荐

  1. 使用Fiddler改变线上js文件的引用路径

    一般的项目开发都是先在本地环境开发,测试环境中完成测试,最后再提交到线上环境. 但是由于版本构建工具有时出现bug或者一些缓存的因素导致测试环境代码可能和线上不一样,这是多么蓝瘦的事情.此处说的是在原 ...

  2. 解决IE6下select显示在弹出框上问题

    利用定位position:absolute;z-index:1;和iframe[z-index:-1]来解决此问题,最好根据需要加上: border='0' frameborder='0' scrol ...

  3. merge into的用法及10g新特性总结

    merge into 的作用: 将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),依赖于on条件,好处是避免了多个insert 和update操作. merge是一个目标 ...

  4. SSA-一种适合中小型企业的新型服务架构

    写在前面 好久好久没写了,最近刚换了工作,花了几天的时候熟悉了项目,接着就是功能的完善,随后就是对新项目的基础架构搭建. 看过Po主博客的都知道,Po主一直致力于推广.Net Core在微服务架构上的 ...

  5. Vue2.0搭建脚手架流程

    介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 安装node.js ...

  6. Node.js 虚拟机

    稳定性: 3 - 稳定 可以通过以下方法访问该模块: var vm = require('vm'); JavaScript 可以立即编译立即执行,也可以编译,保存,之后再运行. vm.runInThi ...

  7. JVM:类的生命周期

    类的生命周期 综述 1.    只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2.    若在加载一个类的过程中,有其他类被切实使用到, ...

  8. springMVC源码分析--ControllerBeanNameHandlerMapping(八)

    在上一篇博客springMVC源码分析--AbstractControllerUrlHandlerMapping(六)中我们介绍到AbstractControllerUrlHandlerMapping ...

  9. 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。

    int findMaxDifBt2Nums(int* arr, int len) { int maxItem = arr[0], minItem = arr[0]; for (int i = 1; i ...

  10. PAM30 模拟登陆 投票

    Python真的是让人爱不释手啊,一直以来都不知道如何自动投票,然而今天有幸看到了PAM30,下面谈一谈我一个小案例吧. 准备 PAM30下载地址 编码前注意 由于一开始没有什么概念,还以为是个第三方 ...